import 'dart:io'; import 'package:didvan/config/design_config.dart'; import 'package:didvan/models/studio_details_data.dart'; import 'package:didvan/models/view/app_bar_data.dart'; import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart'; import 'package:didvan/views/home/widgets/audio_slider.dart'; import 'package:didvan/views/widgets/didvan/scaffold.dart'; import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/skeleton_image.dart'; import 'package:didvan/views/widgets/state_handlers/state_handler.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:webview_flutter/webview_flutter.dart'; class StudioDetails extends StatefulWidget { final Map pageData; const StudioDetails({Key? key, required this.pageData}) : super(key: key); @override State createState() => _StudioDetailsState(); } class _StudioDetailsState extends State { bool _isFullScreen = false; bool _isInit = true; double _dwInPortrait = 0; double _scaleInPortrait = 1; bool get _isVideo => widget.pageData['isVideo']; @override void initState() { final state = context.read(); Future.delayed( Duration.zero, () => state.getStudioDetails(widget.pageData['id']), ); state.args = widget.pageData['args']; if (Platform.isAndroid) WebView.platform = AndroidWebView(); super.initState(); } Future _changeFullSceen(bool value) async { if (value) { await SystemChrome.setEnabledSystemUIMode( SystemUiMode.manual, overlays: [], ); SystemChrome.setSystemUIOverlayStyle( const SystemUiOverlayStyle( systemNavigationBarColor: Colors.black, ), ); await SystemChrome.setPreferredOrientations( [DeviceOrientation.landscapeLeft], ); } else { await SystemChrome.setEnabledSystemUIMode( SystemUiMode.manual, overlays: [SystemUiOverlay.bottom, SystemUiOverlay.top], ); await SystemChrome.setPreferredOrientations( [DeviceOrientation.portraitUp], ); DesignConfig.updateSystemUiOverlayStyle(); } setState(() { _isFullScreen = value; }); } @override Widget build(BuildContext context) { final ds = MediaQuery.of(context).size; if (_isInit) { _dwInPortrait = MediaQuery.of(context).size.width; _scaleInPortrait = _dwInPortrait / 576; _isInit = false; } return Consumer( builder: (context, state, child) => StateHandler( state: state, onRetry: () => state.getStudioDetails(state.currentStudio.id), builder: (context, state) => state.studios.isEmpty ? const SizedBox() : WillPopScope( onWillPop: () async { if (_isFullScreen) { await _changeFullSceen(false); return false; } return true; }, child: DidvanScaffold( appBarData: _isFullScreen ? null : AppBarData( isSmall: true, title: state.currentStudio.title, ), children: [ if (_isVideo) SizedBox( width: ds.width, height: _isFullScreen ? ds.height : ds.width * 9 / 16, child: Stack( children: [ WebView( initialUrl: Uri.dataFromString( ''' ${state.currentStudio.media} ''', mimeType: 'text/html', ).toString(), javascriptMode: JavascriptMode.unrestricted, ), Positioned( right: 42, bottom: 8, child: GestureDetector( onTap: () => _changeFullSceen(!_isFullScreen), child: Container( color: Colors.transparent, width: 24, height: 30, ), ), ), ], ), ), if (!_isVideo) AudioPlayerWidget(podcast: state.currentStudio), ], ), ), ), ); } } class AudioPlayerWidget extends StatelessWidget { final StudioDetailsData podcast; const AudioPlayerWidget({Key? key, required this.podcast}) : super(key: key); @override Widget build(BuildContext context) { return Column( children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 24), child: Hero( tag: podcast.media, child: SkeletonImage( imageUrl: podcast.image, aspectRatio: 1 / 1, ), ), ), const SizedBox(height: 16), DidvanText( podcast.title, style: Theme.of(context).textTheme.bodyText1, ), const SizedBox(height: 16), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: AudioSlider( tag: podcast.media, showTimer: true, ), ), ], ); } }