Pārlūkot izejas kodu

support play completion stream

Caijinglong 6 gadi atpakaļ
vecāks
revīzija
4da857c8df
4 mainītis faili ar 23 papildinājumiem un 11 dzēšanām
  1. 1 0
      TODOLIST.md
  2. 0 5
      example/lib/main.dart
  3. 19 2
      lib/src/controller.dart
  4. 3 4
      lib/src/ijk_event_channel.dart

+ 1 - 0
TODOLIST.md

@@ -11,6 +11,7 @@
   - [x] 停止
   - [x] 释放资源
   - [x] 控制音量
+  - [ ] 监听播放完成
   - [x] 控制系统音量
     - [x] 修复 iOS 系统音量与逻辑相反的问题
     - [x] 修复 iOS 系统音量出现系统弹窗的问题

+ 0 - 5
example/lib/main.dart

@@ -27,11 +27,6 @@ class _MyAppState extends State<MyApp> {
     return OKToast(
       child: MaterialApp(
         home: IndexPage(),
-        supportedLocales: [
-          Locale("cn"),
-          Locale("en"),
-        ],
-        localizationsDelegates: GlobalMaterialLocalizations.delegates,
       ),
     );
   }

+ 19 - 2
lib/src/controller.dart

@@ -68,6 +68,11 @@ class IjkMediaController {
   /// video info stream
   Stream<VideoInfo> get videoInfoStream => _videoInfoController?.stream;
 
+  VideoInfo _info = VideoInfo.fromMap(null);
+
+  /// last update video info.
+  VideoInfo get info => _info;
+
   /// video volume stream controller
   StreamController<int> _volumeController = StreamController.broadcast();
 
@@ -92,9 +97,13 @@ class IjkMediaController {
   /// video volume, not system volume
   int get volume => _volume;
 
-  VideoInfo _info = VideoInfo.fromMap(null);
+  /// playFinish
+  StreamController<IjkMediaController> _playFinishController =
+      StreamController.broadcast();
 
-  VideoInfo get info => _info;
+  /// On play finish
+  Stream<IjkMediaController> get playFinishStream =>
+      _playFinishController.stream;
 
   /// create ijk texture id from native
   Future<void> _initIjk() async {
@@ -118,11 +127,13 @@ class IjkMediaController {
     _videoInfoController?.close();
     _textureIdController?.close();
     _volumeController?.close();
+    _playFinishController?.close();
 
     _playingController = null;
     _videoInfoController = null;
     _textureIdController = null;
     _volumeController = null;
+    _playFinishController = null;
 
     IjkMediaPlayerManager().remove(this);
   }
@@ -329,6 +340,12 @@ class IjkMediaController {
   Future<void> hideSystemVolumeBar() async {
     await IjkManager.hideSystemVolumeBar();
   }
+
+  void _onPlayFinish() {
+    isPlaying = info.isPlaying;
+    refreshVideoInfo();
+    _playFinishController?.add(this);
+  }
 }
 
 /// about channel

+ 3 - 4
lib/src/ijk_event_channel.dart

@@ -28,7 +28,7 @@ class _IJKEventChannel {
       case "finish": // 播放完毕
         // var index = call.arguments["type"];
         // var type = FinishType.values[index];
-        onPlayFinish(getInfo(call));
+        _onPlayFinish(getInfo(call));
         break;
       case "playStateChange":
         onPlayStateChange(getInfo(call));
@@ -52,9 +52,8 @@ class _IJKEventChannel {
     return VideoInfo.fromMap(map);
   }
 
-  void onPlayFinish(VideoInfo info) {
-    controller.isPlaying = info.isPlaying;
-    controller.pause();
+  void _onPlayFinish(VideoInfo info) {
+    controller?._onPlayFinish();
   }
 
   void onPlayStateChange(VideoInfo info) {