flutter - 如何在导航上处理父小部件的同级
问题描述
这是我的小部件的层次结构:
VideoPage
VideoPlayer
RelatedVideos
VideoItem1
VideoItem2
VideoItem3
每当单击 VideoItem 时,我都会导航到新的 VideoPage。我的问题是 VideoPlayer (Chewie) 没有被处理,所以视频一直在后台播放。
我将如何从 VideoItem 中处理 VideoPlayer 小部件?
我尝试了 Navigator.pushReplacement,但我无法回到之前的视频。
这是 VideoItem 小部件中处理导航的代码片段(缩略图被一个手势检测器包裹,点击时会打开一个新页面):
GestureDetector(
onTap: (){
Navigator.push(context, MaterialPageRoute(
builder: (context) {
return VideoPage(
file: file,
thumbnail: thumbnail,
title: videoTitle,
id: id,
);
},
));
},
child: Container(
width: MediaQuery.of(context).size.width,
height: 200.0,
child: ExtendedImage.network(
thumbnail,
fit: BoxFit.fill,
cache: true,
)
),
)
解决方案
你在里面创建控制器initState
吗VideoPage
?deactivate
如果是这样,请尝试在相同的小部件中覆盖控制器pause
和dispose
控制器。这应该在离开VideoPage
.
然后,您可以通过将当前控制器与传入的旧小部件控制器进行比较,尝试didUpdateWidget
重新初始化controllers
在停用时释放的任何内容。
@override
void initState() {
super.initState();
_videoPlayerController = new....
_chewieController = new....
}
@override
void didUpdateWidget(VideoPage oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget._videoPlayerController != oldWidget._videoPlayerController) {
// new controller here
}
}
@override
void deactivate() {
_videoPlayerController.pause();
_videoPlayerController.dispose();
_chewieController.dispose();
super.deactivate();
}
此处有关停用的信息:停用
推荐阅读
- javascript - 基本 JavaScript - 斐波那契数列生成器不工作
- php - After php artisan route:cache my routes stopped working because I have Closure based routes
- mysql - MySQL many to many table convention
- c# - 如何使用 C# 任务库下载和处理一系列数据
- java - 如何暂停我的主线程以便我的 JFrame 可以正常运行
- javascript - WebDriverIO - 从带有动态内容的下拉列表中选择选项
- swift - RealityKit 协作会话调试
- javascript - Django项目,纯javascript、html和模板标签最佳实践
- java - 当我修改 CalendarView 的选定日期时,我得到了一个负月和 31 天以上的月
- stackexchange-api - 使用 curl 命令堆栈交换 API