在构建方法之外访问 BLoC 实例

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

我正在创建一个 Stateful Widget 并使用 BLoC 作为状态管理,我想在其上添加 video_player 包。在 video_player 文档中,他们使用后期初始化控制器并执行 init 状态并直接传递视频链接:

late VideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.asset('assets/Butterfly-209.mp4');

    _controller.addListener(() {
      setState(() {});
    });
    _controller.setLooping(true);
    _controller.initialize().then((_) => setState(() {}));
    _controller.play();
  }

但是,我的 BLoC 值只能在

Widget build
函数块中访问,如下所示:

BlocBuilder<AudioPlayerBloc, AudioPlayerState>(
builder: (context, state) {
return Text(state.videoLink)}),

我的问题:

  1. 如何以正确的方式初始化
    VideoPlayerController.asset
    链接到
    state.videoLink
    ?有没有办法不使用 initState 而是使用 BLoC State ?
  2. 继续上一个问题,如何以正确的方式将
    VideoPlayerController
    变量保存到 BLoC 中,以便我可以通过访问
    BlocBuilder
    并使用它的方法来在
    state.videoPlayerController
    中访问它,例如
    .play()
    ?我已经通过在 BLoC State 中创建变量并在 BlocBuilder 中访问来尝试过此操作,但它仍然无法正常运行。
android flutter bloc state-management flutter-bloc
1个回答
0
投票

将此文件添加到您的项目中

video_player_widget.dart

将此代码添加到“video_player_widget”文件中:-

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';


    class VideoPlayerWidget extends StatefulWidget {
      final String videoUrl;


      const VideoPlayerWidget(
          {super.key,
          required this.videoUrl});

      @override
      State<VideoPlayerWidget> createState() =>
          VideoPlayerWidgetState();
    }

    class VideoPlayerWidgetState extends State<VideoPlayerWidget> {
      late VideoPlayerController videoPlayerController;
   

      @override
      void initState() {

        setController();
        super.initState();
      }



      @override
      void dispose() {
        videoPlayerController.dispose();

        super.dispose();
      }

      @override
      Widget build(BuildContext context) {
        return (videoPlayerController.value.isInitialized)
            ? VideoPlayer(videoPlayerController)
            : SizedBox(
            height: 100,
            width: 100,
            child: Center(child: CircularProgressIndicator()));
      }

      Future setController() async {
        try {

            videoPlayerController = VideoPlayerController.networkUrl(
                Uri.parse(widget.videoUrl),
                videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true));

          await videoPlayerController.initialize();

        } on Exception catch (e, s) {
          print("Video Url is Not Set $e $s");
        }
        setState(() {});
      }


    }

然后在您的集团提供商中:-

BlocBuilder<AudioPlayerBloc, AudioPlayerState>(
builder: (context, state) {
return VideoPlayerWidget(videoUrl: "assets/Butterfly-209.mp4");
}),
© www.soinside.com 2019 - 2024. All rights reserved.