在从页面导航到另一页时,如何暂停flutter视频(video_player插件)



我正在使用Flutter Video_player(https://pub.dartlang.org/packages/video_player)插件来播放视频。但是,当我从一页导航到另一页时,视频仍在播放。在播放其他任何应用程序的音乐时,我也遇到了同样的问题(例如:播放Flutter视频时从通知中播放音乐)。我该如何停下来?

编辑: 第二个选项:所以我提出了另一个解决方案。VisibilityDetector是一个可以包装任何其他小部件并通知小部件的可见区域的"小部件"。

VisibilityDetector(
   key: Key("unique key"),
   onVisibilityChanged: (VisibilityInfo info) {
       debugPrint("${info.visibleFraction} of my widget is visible");
       if(info.visibleFraction == 0){
           videoPlayerController.pause();
       }
       else{
           videoPlayerController.play();
       }
   },
   child: VideoPlayer());
)

第一个选项:通过使用RouteObserverRouteAware,每当将另一个屏幕推到顶部,或者弹出回到顶部时,您的小部件就会通知。

首先,您需要将RouteObserver添加到MaterialAppNavigator

RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      navigatorObservers: [routeObserver], //HERE
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

然后,您必须将RouteAware Mixin添加到小部件,然后订阅RouteObserver

class VideoPlayerItem extends StatefulWidget {
  final File file;
  VideoPlayerItem(this.file);
  @override
  _VideoPlayerItemState createState() => _VideoPlayerItemState();
}
class _VideoPlayerItemState extends State<VideoPlayerItem> with RouteAware {
  VideoPlayerController _videoPlayerController;
  @override
  void initState() {
    super.initState();
    _videoPlayerController = VideoPlayerController.file(widget.file);
    _videoPlayerController.initialize().then((_) {
      if (mounted) {
        setState(() {});
        _videoPlayerController.play();
      }
    });
  }
  @override
  void didChangeDependencies() {
    routeObserver.subscribe(this, ModalRoute.of(context));//Subscribe it here
    super.didChangeDependencies();
  }
  /// Called when the current route has been popped off.
  @override
  void didPop() {
    print("didPop");
    super.didPop();
  }
  /// Called when the top route has been popped off, and the current route
  /// shows up.
  @override
  void didPopNext() {
    print("didPopNext");
    _videoPlayerController.play();
    super.didPopNext();
  }
  /// Called when the current route has been pushed.
  @override
  void didPush() { 
    print("didPush");
    super.didPush();
  }
  /// Called when a new route has been pushed, and the current route is no
  /// longer visible.
  @override
  void didPushNext() {
    print("didPushNext");
    _videoPlayerController.pause();
    super.didPushNext();
  }

  @override
  Widget build(BuildContext context) {
    return _videoPlayerController?.value?.initialized ?? false
        ? AspectRatio(
            aspectRatio: _videoPlayerController.value.aspectRatio,
            child: VideoPlayer(_videoPlayerController),
          )
        : Container();
  }
  @override
  void dispose() {
    routeObserver.unsubscribe(this); //Don't forget to unsubscribe it!!!!!!
    super.dispose();
    _videoPlayerController.dispose();
  }
}

您有- VideoPlayerController _controller;

在导航到其他屏幕之前 -

 _controller.pause();  // add this
Navigator.push(
      context, MaterialPageRoute(builder: (BuildContext context) => NextPage()));

如果它是一个有状态的小部件,则可以覆盖-dispose()方法。

@override
  void dispose() {
   super.dispose();
   _controller.pause();
  }

简单,它对我的工作,我从chewie示例代码:https://pub.dev/packages/chewie/chewie/example

仅在Ontap/Onpressed使用setState和此SetState中,使VideoController.pause或Dispose,无论您想要什么。

 onTap:() {
        setState(() {
          widget.videoController.pause();
          Navigator.of(context)
              .pushNamed(YOUR-NAVIGATION-PAGE-NAME);
        });
      },

最新更新