我正在使用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());
)
第一个选项:通过使用RouteObserver
和RouteAware
,每当将另一个屏幕推到顶部,或者弹出回到顶部时,您的小部件就会通知。
首先,您需要将RouteObserver
添加到MaterialApp
或Navigator
。
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);
});
},