Browse Source

Add example for IJKPlayer in PageView.

Caijinglong 6 năm trước cách đây
mục cha
commit
d98d698089

+ 5 - 2
example/lib/main.dart

@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
 import 'package:ijkplayer_example/page/index.dart';
+import 'package:oktoast/oktoast.dart';
 
 void main() {
   IjkConfig.isLog = true;
@@ -17,8 +18,10 @@ class MyApp extends StatefulWidget {
 class _MyAppState extends State<MyApp> {
   @override
   Widget build(BuildContext context) {
-    return MaterialApp(
-      home: IndexPage(),
+    return OKToast(
+      child: MaterialApp(
+        home: IndexPage(),
+      ),
     );
   }
 }

+ 2 - 0
example/lib/page/index.dart

@@ -4,6 +4,7 @@ import 'package:ijkplayer_example/page/dialog_video_page.dart';
 import 'package:ijkplayer_example/page/full_screen.dart';
 import 'package:ijkplayer_example/page/gallery_page.dart';
 import 'package:ijkplayer_example/page/network.dart';
+import 'package:ijkplayer_example/page/paging_page.dart';
 import 'package:ijkplayer_example/page/video_list.dart';
 
 class IndexPage extends StatefulWidget {
@@ -27,6 +28,7 @@ class _IndexPageState extends State<IndexPage> {
           buildButton("全屏切换示例(自动)", FullScreen()),
           buildButton("全屏切换示例(手动)", FullScreen2()),
           buildButton("在dialog中播放显示视频", DialogVideoPage()),
+          buildButton("纵向视频", PagingPickPage()),
         ],
       ),
     );

+ 151 - 0
example/lib/page/paging_page.dart

@@ -0,0 +1,151 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:oktoast/oktoast.dart';
+import 'package:photo/photo.dart';
+
+class PagingPickPage extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("选择视频"),
+      ),
+      body: ListView(
+        children: <Widget>[
+          FlatButton(
+            child: Text("选择视频并开启"),
+            onPressed: () => pickVideo(context),
+          ),
+        ],
+      ),
+    );
+  }
+
+  pickVideo(BuildContext context) async {
+    var photos = await PhotoPicker.pickAsset(
+      context: context,
+      maxSelected: 8,
+      pickType: PickType.onlyVideo,
+    );
+
+    if (photos == null || photos.isEmpty) {
+      showToast("没选择视频");
+      return;
+    }
+
+    showDialog(
+      context: context,
+      builder: (_) => buildLoadingWidget(),
+    );
+
+    List<DataSource> dataSourceList = [];
+    for (var photo in photos) {
+      var file = await photo.file;
+      dataSourceList.add(DataSource.file(file));
+    }
+
+    Navigator.pop(context);
+
+    Navigator.push(
+      context,
+      MaterialPageRoute(
+        builder: (_) => PagingPage(
+              dataSourceList: dataSourceList,
+            ),
+      ),
+    );
+  }
+}
+
+Widget buildLoadingWidget() {
+  return Center(
+    child: Container(
+      decoration: BoxDecoration(
+        borderRadius: BorderRadius.circular(8),
+        color: Colors.white,
+      ),
+      width: 80,
+      height: 80,
+      padding: EdgeInsets.all(22),
+      child: CircularProgressIndicator(),
+    ),
+  );
+}
+
+class PagingPage extends StatefulWidget {
+  final List<DataSource> dataSourceList;
+
+  const PagingPage({
+    Key key,
+    this.dataSourceList,
+  }) : super(key: key);
+
+  @override
+  _PagingPageState createState() => _PagingPageState();
+}
+
+class _PagingPageState extends State<PagingPage> {
+  Map<DataSource, IjkMediaController> map = {};
+  @override
+  void initState() {
+    super.initState();
+    assert(widget.dataSourceList != null);
+    assert(widget.dataSourceList.isNotEmpty);
+    initFirst();
+  }
+
+  void initFirst() async {
+    await Future.delayed(Duration(seconds: 1));
+    getControllerWithSrc(widget.dataSourceList[0])?.play();
+  }
+
+  @override
+  void dispose() {
+    _disposeAllCtl();
+    super.dispose();
+  }
+
+  _disposeAllCtl() {
+    for (var ctl in map.values) {
+      ctl?.dispose();
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    assert(widget.dataSourceList != null);
+
+    return PageView.builder(
+      scrollDirection: Axis.vertical,
+      itemBuilder: _buildItem,
+      itemCount: widget.dataSourceList.length,
+      onPageChanged: (current) {
+        print("current page = $current");
+        var src = widget.dataSourceList[current];
+        var ctl = getControllerWithSrc(src);
+        ctl?.pauseOtherController();
+        ctl?.seekTo(0);
+        ctl?.play();
+      },
+    );
+  }
+
+  Widget _buildItem(BuildContext context, int index) {
+    var src = widget.dataSourceList[index];
+    var ctl = getControllerWithSrc(src);
+    return IjkPlayer(
+      mediaController: ctl,
+      controllerWidgetBuilder: (_) => Container(),
+    );
+  }
+
+  IjkMediaController getControllerWithSrc(DataSource src) {
+    var ctl = map[src];
+    if (ctl == null) {
+      ctl = IjkMediaController();
+      map[src] = ctl;
+      ctl.setDataSource(src, autoPlay: false);
+    }
+    return ctl;
+  }
+}

+ 8 - 0
example/pubspec.lock

@@ -67,6 +67,13 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "1.1.6"
+  oktoast:
+    dependency: "direct main"
+    description:
+      name: oktoast
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "2.1.6"
   path:
     dependency: transitive
     description:
@@ -165,3 +172,4 @@ packages:
     version: "2.0.8"
 sdks:
   dart: ">=2.2.0 <3.0.0"
+  flutter: ">=0.3.0 <2.0.0"

+ 1 - 0
example/pubspec.yaml

@@ -13,6 +13,7 @@ dependencies:
   # Use with the CupertinoIcons class for iOS style icons.
   cupertino_icons: ^0.1.2
   photo: ^0.3.3
+  oktoast: ^2.1.6
 
 dev_dependencies:
   flutter_test: