didvan-app/lib/views/podcasts/studio_details/studio_details.mobile.dart

144 lines
4.9 KiB
Dart

// ignore_for_file: use_build_context_synchronously
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/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/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() {
_betterPlayerController = BetterPlayerController(
const BetterPlayerConfiguration(
aspectRatio: 16 / 9,
showPlaceholderUntilPlay: true,
autoDispose: false,
fullScreenAspectRatio: 16 / 9,
),
);
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) {
_handleVideoPlayback(state);
}
return WillPopScope(
onWillPop: () async {
if (MediaService.currentPodcast != null) {
state.studio = MediaService.currentPodcast!;
}
state.handleTracking(id: state.studio.id);
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(
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),
),
),
],
),
),
),
),
),
);
},
),
);
}
Future<void> _handleVideoPlayback(state) async {
final betterPlayerDataSource = BetterPlayerDataSource(
BetterPlayerDataSourceType.network,
state.studio.link,
videoFormat: BetterPlayerVideoFormat.hls,
);
await _betterPlayerController.clearCache();
await _betterPlayerController.setupDataSource(betterPlayerDataSource);
_betterPlayerController.setBetterPlayerControlsConfiguration(
BetterPlayerControlsConfiguration(
enablePlaybackSpeed: false,
enableSubtitles: false,
enableAudioTracks: false,
progressBarPlayedColor: Theme.of(context).colorScheme.secondary,
progressBarHandleColor: Theme.of(context).colorScheme.secondary,
),
);
_currentlyPlayingId = state.studio.id;
}
@override
void dispose() {
_betterPlayerController.pause();
_betterPlayerController.dispose();
super.dispose();
}
}