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

问题描述 投票:0回答:2

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

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,
    )
  ),
)
flutter dart flutter-layout
2个回答
2
投票

您是否在initState中的VideoPage中创建控制器?如果是这样,请尝试将同一窗口小部件中的deactivate覆盖到控制器的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();
}

此处有关停用的信息:Deactivate


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())
});
© www.soinside.com 2019 - 2024. All rights reserved.