diff --git a/lib/pages/repeatafter/widgets/repeat_after_item.dart b/lib/pages/repeatafter/widgets/repeat_after_item.dart index 4cbd1b8..9d28556 100644 --- a/lib/pages/repeatafter/widgets/repeat_after_item.dart +++ b/lib/pages/repeatafter/widgets/repeat_after_item.dart @@ -20,9 +20,10 @@ class RepeatAfterItem extends StatelessWidget { child: GestureDetector( onTap: (){ if (entity != null) { - if (!entity!.lock!) { - tapEvent?.call(); - } + // if (!entity!.lock!) { + // tapEvent?.call(); + // } + tapEvent?.call(); } }, child: Stack( diff --git a/lib/pages/repeataftercontent/bloc/repeat_after_content_bloc.dart b/lib/pages/repeataftercontent/bloc/repeat_after_content_bloc.dart index b8898b7..dcfd250 100644 --- a/lib/pages/repeataftercontent/bloc/repeat_after_content_bloc.dart +++ b/lib/pages/repeataftercontent/bloc/repeat_after_content_bloc.dart @@ -69,6 +69,7 @@ class RepeatAfterContentBloc extends Bloc(_voiceRecordStateChange); on(_postFollowReadContent); + on(_changeVideoPlayIndex); on(_videoPlayStateChange); on(_recordeVoicePlay); on(_voiceXsResult); @@ -207,4 +208,10 @@ class RepeatAfterContentBloc extends Bloc emitter) async { + emitter(ChangeVideoPlayIndexState(event.isNext)); + } } diff --git a/lib/pages/repeataftercontent/bloc/repeat_after_content_event.dart b/lib/pages/repeataftercontent/bloc/repeat_after_content_event.dart index afd392d..9b48e16 100644 --- a/lib/pages/repeataftercontent/bloc/repeat_after_content_event.dart +++ b/lib/pages/repeataftercontent/bloc/repeat_after_content_event.dart @@ -46,4 +46,9 @@ class RecordeVoicePlayEvent extends RepeatAfterContentEvent { class PostFollowReadContentEvent extends RepeatAfterContentEvent {} +class ChangeVideoPlayIndexEvent extends RepeatAfterContentEvent { + final bool isNext; + ChangeVideoPlayIndexEvent(this.isNext); +} + diff --git a/lib/pages/repeataftercontent/bloc/repeat_after_content_state.dart b/lib/pages/repeataftercontent/bloc/repeat_after_content_state.dart index 20ac8ca..d881816 100644 --- a/lib/pages/repeataftercontent/bloc/repeat_after_content_state.dart +++ b/lib/pages/repeataftercontent/bloc/repeat_after_content_state.dart @@ -14,3 +14,8 @@ class VoiceRecordStateChange extends RepeatAfterContentState {} class RequestDataState extends RepeatAfterContentState {} class XSVoiceTestState extends RepeatAfterContentState {} + +class ChangeVideoPlayIndexState extends RepeatAfterContentState { + final bool isNext; + ChangeVideoPlayIndexState(this.isNext); +} diff --git a/lib/pages/repeataftercontent/repeat_after_content_page.dart b/lib/pages/repeataftercontent/repeat_after_content_page.dart index c6329fb..ec24037 100644 --- a/lib/pages/repeataftercontent/repeat_after_content_page.dart +++ b/lib/pages/repeataftercontent/repeat_after_content_page.dart @@ -79,7 +79,7 @@ class _RepeatAfterContentPage extends StatelessWidget { fit: BoxFit.fill ), ), - child: videoUrl.isEmpty?Container(): RepeatVideoWidget(videoUrl: bloc.entityList?.first?.videoUrl,), + child: videoUrl.isEmpty?Container(): RepeatVideoWidget(videoUrl: bloc.entityList?.first?.videoUrl,videoUrls: bloc.entityList??[],), ), ), ///右侧操作区 @@ -157,38 +157,30 @@ class _RepeatAfterContentPage extends StatelessWidget { children: [ Row( children: [ - SizedBox( - height: 23.h, - width: 33.w, + IconButton( + onPressed: () => bloc.add(ChangeVideoPlayIndexEvent(false)), + icon: Image.asset( + 'previous'.assetPng, + height: 23.h, + width: 23.w, + ) ), - // IconButton( - // onPressed: (){}, - // icon: Image.asset( - // 'previous'.assetPng, - // height: 23.h, - // width: 23.w, - // ) - // ), IconButton( onPressed:() => bloc.add(VideoPlayChangeEvent()), icon: Image.asset( 'video_pause'.assetPng, height: 50.h, - width: 50.w, + width: 50.h, ) ), - SizedBox( - height: 23.h, - width: 23.w, - ), - // IconButton( - // onPressed: (){}, - // icon: Image.asset( - // 'next'.assetPng, - // height: 23.h, - // width: 23.w, - // ) - // ) + IconButton( + onPressed: () => bloc.add(ChangeVideoPlayIndexEvent(true)), + icon: Image.asset( + 'next'.assetPng, + height: 23.h, + width: 23.w, + ) + ) ], ), Row( diff --git a/lib/pages/repeataftercontent/widgets/repeat_video_widget.dart b/lib/pages/repeataftercontent/widgets/repeat_video_widget.dart index 70434a6..f6bf34b 100644 --- a/lib/pages/repeataftercontent/widgets/repeat_video_widget.dart +++ b/lib/pages/repeataftercontent/widgets/repeat_video_widget.dart @@ -2,12 +2,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:video_player/video_player.dart'; +import 'package:wow_english/models/read_content_entity.dart'; import '../bloc/repeat_after_content_bloc.dart'; class RepeatVideoWidget extends StatefulWidget { - const RepeatVideoWidget({super.key, this.videoUrl}); + const RepeatVideoWidget({super.key, this.videoUrl, required this.videoUrls}); final String? videoUrl; + final List videoUrls; @override State createState() { @@ -20,6 +22,7 @@ class _RepeatVideoWidgetState extends State { String _currentTime = '00:00'; String _totalTime = '00:00'; double _playDegree = 0.5; + int _currentPlayIndex = 0; String formatDuration(Duration duration) { String minutes = duration.inMinutes.remainder(60).toString().padLeft(2, '0'); @@ -52,17 +55,11 @@ class _RepeatVideoWidgetState extends State { @override void initState() { super.initState(); - _controller = VideoPlayerController.network(widget.videoUrl??'') - ..initialize().then((_){ - setState(() { - _currentTime = formatDuration(_controller!.value.position); - _totalTime = formatDuration(_controller!.value.duration); - _controller!.setLooping(true); - _controller!.setVolume(100); - _controller!.play(); - }); - _addListener(); - }); + var videoUrl = ''; + if(widget.videoUrls.isNotEmpty) { + videoUrl = widget.videoUrls[_currentPlayIndex]?.videoUrl??''; + } + _initVideo(videoUrl); } @override @@ -77,6 +74,22 @@ class _RepeatVideoWidgetState extends State { _controller!.pause(); } } + + if (state is ChangeVideoPlayIndexState) { + if(state.isNext) { + if (_currentPlayIndex != (widget.videoUrls.length-1)) { + _currentPlayIndex++; + _destroyVideo(); + _initVideo(widget.videoUrls[_currentPlayIndex]!.videoUrl!); + } + } else { + if (_currentPlayIndex > 0) { + _currentPlayIndex--; + _destroyVideo(); + _initVideo(widget.videoUrls[_currentPlayIndex]!.videoUrl!); + } + } + } }, child: SizedBox( child: Column( @@ -105,20 +118,10 @@ class _RepeatVideoWidgetState extends State { left: 0, right: 0, bottom: 0, - child: Slider( - min:0, - max: 1.0, - activeColor: const Color(0xFF78B72D), - inactiveColor: const Color(0xFF7E756C), - onChangeStart: (value) { - - }, - onChangeEnd: (value) { - - }, - onChanged: (value) { - - }, value: _playDegree, + child: LinearProgressIndicator( + color: const Color(0xFF78B72D), + backgroundColor: const Color(0xFF7E756C), + value: _playDegree, )) ], ), @@ -148,10 +151,28 @@ class _RepeatVideoWidgetState extends State { ); } - @override - void dispose() { + void _initVideo(String videoUrl) { + _controller = VideoPlayerController.network(widget.videoUrl??'') + ..initialize().then((_){ + setState(() { + _currentTime = formatDuration(_controller!.value.position); + _totalTime = formatDuration(_controller!.value.duration); + _controller!.setLooping(false); + _controller!.setVolume(100); + _controller!.play(); + }); + _addListener(); + }); + } + + void _destroyVideo() { _controller?.dispose(); _controller?.removeListener(() {}); + } + + @override + void dispose() { + _destroyVideo(); super.dispose(); } } \ No newline at end of file