didvan-app/lib/views/home/studio/studio_details/studio_details.mobile.dart

136 lines
4.8 KiB
Dart

import 'package:better_player/better_player.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/home/studio/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/home/widgets/bookmark_button.dart';
import 'package:didvan/views/widgets/didvan/app_bar.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class StudioDetails extends StatefulWidget {
final Map<String, dynamic> pageData;
const StudioDetails({Key? key, required this.pageData}) : super(key: key);
@override
State<StudioDetails> createState() => _StudioDetailsState();
}
class _StudioDetailsState extends State<StudioDetails> {
int _currentlyPlayingId = 0;
late BetterPlayerController _betterPlayerController;
@override
void initState() {
final state = context.read<StudioDetailsState>();
state.args = widget.pageData['args'];
Future.delayed(
Duration.zero,
() => state.getStudioDetails(widget.pageData['id']),
);
super.initState();
}
@override
Widget build(BuildContext context) {
final d = MediaQuery.of(context);
return Consumer<StudioDetailsState>(
builder: (context, state, child) => StateHandler<StudioDetailsState>(
state: state,
onRetry: () {
try {
state.getStudioDetails(state.studio.id);
} catch (e) {
state.getStudioDetails(widget.pageData['id']);
}
},
builder: (context, state) {
if (_currentlyPlayingId != state.studio.id) {
BetterPlayerDataSource betterPlayerDataSource =
BetterPlayerDataSource(
BetterPlayerDataSourceType.network,
state.studio.link,
);
_betterPlayerController = BetterPlayerController(
BetterPlayerConfiguration(
aspectRatio: 16 / 9,
showPlaceholderUntilPlay: true,
controlsConfiguration: BetterPlayerControlsConfiguration(
enablePlaybackSpeed: false,
enableSubtitles: false,
enableAudioTracks: false,
progressBarPlayedColor:
Theme.of(context).colorScheme.secondary,
progressBarHandleColor:
Theme.of(context).colorScheme.secondary,
),
fit: BoxFit.contain,
fullScreenAspectRatio: 16 / 9,
),
betterPlayerDataSource: betterPlayerDataSource,
);
_currentlyPlayingId = state.studio.id;
}
return WillPopScope(
onWillPop: () async {
if (MediaService.currentPodcast != null) {
state.studio = MediaService.currentPodcast!;
}
return true;
},
child: SafeArea(
child: Scaffold(
backgroundColor: Theme.of(context).colorScheme.surface,
appBar: PreferredSize(
preferredSize: const Size.fromHeight(56),
child: DidvanAppBar(
appBarData: AppBarData(
trailing: BookmarkButton(
itemId: state.studio.id,
type: 'video',
value: state.studio.marked,
onMarkChanged: (value) {
widget.pageData['onMarkChanged'](
state.studio.id, value);
},
gestureSize: 48,
),
isSmall: true,
title: state.studio.title,
),
),
),
body: SingleChildScrollView(
physics: const NeverScrollableScrollPhysics(),
child: SizedBox(
height: d.size.height - d.padding.top - 56,
child: Column(
children: [
BetterPlayer(controller: _betterPlayerController),
Expanded(
child: StudioDetailsWidget(
onMarkChanged: (id, value) => widget
.pageData['onMarkChanged'](id, value, true),
),
),
],
),
),
),
),
),
);
},
),
);
}
// @override
// void dispose() {
// _betterPlayerController.dispose();
// super.dispose();
// }
}