如何在导航上放置父级小部件的同级

时间:2020-01-10 23:53:29

标签: flutter dart flutter-layout

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

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

2 个答案:

答案 0 :(得分:2)

您是否在initState的{​​{1}}内部创建控制器?如果是这样,请尝试将同一小部件​​中的VideoPage覆盖到控制器的deactivatepause。从dispose离开时应该会发生这种情况。

然后,您可以通过将当前控制器与传入的旧窗口小部件控制器进行比较,尝试使用VideoPage重新初始化在停用时处置的所有didUpdateWidget

controllers

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

答案 1 :(得分:0)

您可以将控制器传递回另一个视图并进行处理:

Navigator.push(context, MaterialPageRoute(
  builder: (context) {
    return VideoPage(
      file: file,
      thumbnail: thumbnail,
      title: videoTitle,
      id: id,
    );
  },
)).then((List<ChewieController> controllers){
  controllers.forEach((controller) => controller.dispose())
});