Flutter Consumer微件中的子微件值未更改

mrwjdhj3  于 2023-04-22  发布在  Flutter
关注(0)|答案(1)|浏览(100)

你好,请我试图通过一个视频源从我创建的提供程序类.它的工作每隔一个地方,我用它像得到视频拇指等.但我试图通过视频源到我的视频小部件.当我选择的视频,它不更新,但如果我导航离开,回来的源将被更新.我希望它更新,因为我改变视频源.
以下是我目前正在使用的代码:
channel_provider.dart:

Map selectedChannel = {};

// Select channel
  void selectChannel(Map channel) {
    selectedChannel = channel;
    saveRecentChannel(channel);
    notifyListeners();
  }

列出所有频道的主屏幕,还包含视频播放器

Consumer<ChannelProvider>(
          builder: (context, channelProvider, _) =>
              channelProvider.selectedChannel.isNotEmpty
                  ? SizedBox(
                      height: context.height() / 3.8,
                      child: VideoPlayerBox(channelProvider.getSelectedVideo),
                    )
                  : Shimmer.fromColors(
                      baseColor: Colors.grey,
                      highlightColor: Colors.white,
                      child: SizedBox(
                        height: context.height() / 3.8,
                        child: Center(
                          child: Text(
                            'Loading...',
                            style: Theme.of(context).textTheme.headlineLarge,
                          ),
                        ),
                      ),
                    ),
        ),

视频播放器框小部件:

class _VideoPlayerBoxState extends State<VideoPlayerBox> {
  late VideoPlayerController _controller;
  ChewieController? _chewieController;
  var _videoSource;

  @override
  void initState() {
  _videoSource = widget.channel;
    iniVideo();
    super.initState();
  }

  Future<void> iniVideo() async {
    log(_videoSource['link']);
    log('hi');
    _controller = VideoPlayerController.network(_videoSource['link']);
    await _controller.initialize();

    setState(() {
      _chewieController = ChewieController(
        videoPlayerController: _controller,
        autoPlay: true,
        isLive: true,
      );
    });
  }

  @override
  void dispose() {
    _controller.dispose();
    _chewieController?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return _chewieController != null
        ? SizedBox(
            width: context.width(),
            height: context.height(),
            child: Chewie(controller: _chewieController!),
          )
        : SizedBox(
            width: context.width(),
            height: context.height(),
          );
  }
}

预期行为我希望频道源更新视频框中的使用时,点击频道.但它不它保持在initai视频源,但当我离开屏幕,并返回视频源现在将更新.
我想让它在飞行中更新。

wqnecbli

wqnecbli1#

有两件事可能导致这个问题。
1.你的供应商是不正确的,但我必须认为它是正确的,因为你没有显示它的完整代码。
1.你必须给予VideoPlayerBox一个密钥,你可以这样做:

...  
SizedBox(
  height: context.height() / 3.8,
  child: VideoPlayerBox(
           channelProvider.getSelectedVideo,  
           key: const ValueKey(channelProvider.getSelectedVideo.channel['link']),
),
)
...

如果您的供应商是正确的,这应该可以工作。也许您可以在这里看看:https://youtu.be/kn0EOS-ZiIc?t=313

相关问题