首页 > 解决方案 > 如何在导航上处理父小部件的同级

问题描述

这是我的小部件的层次结构:

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,
    )
  ),
)

标签: flutterdartflutter-layout

解决方案


你在里面创建控制器initStateVideoPagedeactivate如果是这样,请尝试在相同的小部件中覆盖控制器pausedispose控制器。这应该在离开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();
}

此处有关停用的信息:停用


推荐阅读