是否可以在 flutter 中的无状态小部件中创建视频播放器?

发布于 2025-01-12 22:34:51 字数 1271 浏览 7 评论 0原文

我试图在颤振中的无状态小部件中创建视频播放器。我做不到......这是我使用的代码......是否可以在无状态小部件中创建视频播放器?

class VideoWidget extends StatelessWidget {
  VideoWidget({Key? key}) : super(key: key);
  final videoController =
      VideoPlayerController.network('https://youtu.be/_EoLNs5m-7Y?t=4')
        ..initialize();
  @override
  Widget build(BuildContext context) {
    return SizedBox(
      width: MediaQuery.of(context).size.width,
      //height: 500,
      child: Column(
        children: [
          //VideoPlayer(videoController!),
          ValueListenableBuilder(
              valueListenable: videoPlayerNotifier,
              builder: (BuildContext cxt, play, widget_) {
                return videoController.value.isInitialized
                    ? AspectRatio(
                        aspectRatio: videoController.value.aspectRatio,
                        child: VideoPlayer(videoController))
                    : Container();
              }),

          const Text(
            'movieName',
             style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
          ),
          const Text('Description'),
          FloatingActionButton(onPressed: () {
            videoPlayerNotifier.value = true;
          })
        ],
      ),
    );
  }
}

I was trying to create a videoplayer in a stateless widget in flutter. I could not do it.... this is the code I used ...Is it possible to create a video player in a stateless widget?

class VideoWidget extends StatelessWidget {
  VideoWidget({Key? key}) : super(key: key);
  final videoController =
      VideoPlayerController.network('https://youtu.be/_EoLNs5m-7Y?t=4')
        ..initialize();
  @override
  Widget build(BuildContext context) {
    return SizedBox(
      width: MediaQuery.of(context).size.width,
      //height: 500,
      child: Column(
        children: [
          //VideoPlayer(videoController!),
          ValueListenableBuilder(
              valueListenable: videoPlayerNotifier,
              builder: (BuildContext cxt, play, widget_) {
                return videoController.value.isInitialized
                    ? AspectRatio(
                        aspectRatio: videoController.value.aspectRatio,
                        child: VideoPlayer(videoController))
                    : Container();
              }),

          const Text(
            'movieName',
             style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
          ),
          const Text('Description'),
          FloatingActionButton(onPressed: () {
            videoPlayerNotifier.value = true;
          })
        ],
      ),
    );
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

单身狗的梦 2025-01-19 22:34:51

video_player pub 包中的 VideoPlayer 是有状态的,特别是由于 VideoPlayerController。但是,您可以将其包装在 StatefulWidget 中以在 StatelessWidget 中使用。例如,在无状态小部件中使用此包装器:

class VideoPlayerWrapper extends StatefulWidget {
  final String videoUri;

  const VideoPlayerWrapper({Key? key, required this.videoUri}) : super(key: key);

  @override
  _VideoPlayerWrapperState createState() => _VideoPlayerWrapperState(videoUri);
}

class _VideoPlayerWrapperState extends State<VideoPlayerWrapper> {
  late VideoPlayerController _controller;
  final String videoUri;


  _VideoPlayerWrapperState(this.videoUri);

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(videoUri)
      ..initialize().then((_) {
        // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
        setState(() {});
      });
    _controller.play();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
          child: _controller.value.isInitialized
              ? AspectRatio(
            aspectRatio: _controller.value.aspectRatio,
            child: VideoPlayer(_controller),
          )
              : Container(),
    );
  }

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

VideoPlayer from the video_player pub package is quite stateful, due especially to VideoPlayerController. However, you can wrap it in a StatefulWidget to be used within a StatelessWidget. E.g. use this wrapper within a stateless widget:

class VideoPlayerWrapper extends StatefulWidget {
  final String videoUri;

  const VideoPlayerWrapper({Key? key, required this.videoUri}) : super(key: key);

  @override
  _VideoPlayerWrapperState createState() => _VideoPlayerWrapperState(videoUri);
}

class _VideoPlayerWrapperState extends State<VideoPlayerWrapper> {
  late VideoPlayerController _controller;
  final String videoUri;


  _VideoPlayerWrapperState(this.videoUri);

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(videoUri)
      ..initialize().then((_) {
        // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
        setState(() {});
      });
    _controller.play();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
          child: _controller.value.isInitialized
              ? AspectRatio(
            aspectRatio: _controller.value.aspectRatio,
            child: VideoPlayer(_controller),
          )
              : Container(),
    );
  }

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文