VideoPlayer 无法正确初始化 flutter

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

我正在尝试构建一个列表视图,当“视频”参数不为空时显示视频播放器。虽然我已经成功显示了视频播放器,但视频似乎没有正确初始化,它显示了一个黑色容器,并且只有在我设置一个按钮来初始化它时才会初始化,即使我已经在 initState 中初始化了视频播放器。有人可以帮我吗?代码如下:

import 'package:c_joga/models/classes/user.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class PostItem extends StatefulWidget {
  const PostItem({
    super.key,
    required this.post,
  });

  final Post post;

  @override
  State<PostItem> createState() => _PostItemState();
}

class _PostItemState extends State<PostItem> {
  VideoPlayerController? videoController;

  @override
  void initState() {
    if (widget.post.video != null) {
      setState(() {
        videoController = _initializeVideoPlayer(widget.post.video!);
      });
    }
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
    if (widget.post.video != null) {
      videoController?.dispose();
    }
  }

  @override
  Widget build(BuildContext context) {
    // print('AQUI O OBJETO ${widget.post.description}${widget.post.video}');
    return SizedBox(
      width: MediaQuery.of(context).size.width * 0.185,
      child: Card(
          color: Theme.of(context).colorScheme.secondary,
          shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(
            20,
          )),
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    Row(
                      children: [
                        CircleAvatar(
                            // backgroundImage: NetworkImage(post.user.userImageUrl!),
                            ),
                        const SizedBox(
                          width: 10,
                        ),
                        Text('@${widget.post.user.username}')
                      ],
                    ),
                    IconButton(
                      onPressed: () {},
                      icon: const Icon(
                        Icons.more_horiz,
                      ),
                    ),
                  ],
                ),
                if (widget.post.description != null)
                  Text(widget.post.description!),
                const SizedBox(
                  height: 10,
                ),
                if (widget.post.photo != null)
                  Container(
                    height: 250,
                    decoration: BoxDecoration(
                      image: DecorationImage(
                          image: NetworkImage(
                            widget.post.photo!,
                          ),
                          fit: BoxFit.cover),
                    ),
                  ),
                if (videoController != null)
                  Stack(
                    alignment: Alignment.center,
                    children: [
                      Container(
                        height: 350,
                        child: VideoPlayer(videoController!),
                      ),
                      Stack(
                        alignment: Alignment.center,
                        children: [
                          CircleAvatar(
                              backgroundColor: Colors.black26,
                              child: Container(
                                  decoration: BoxDecoration(
                                shape: BoxShape.circle,
                                border: Border.all(
                                  color: Colors.white,
                                  width: 3,
                                ),
                              ))),
                          IconButton(
                            style: ButtonStyle(
                              elevation: MaterialStatePropertyAll(300),
                            ),
                            onPressed: () {
                              setState(() {
                                if (videoController!.value.isPlaying) {
                                  videoController!.pause();
                                } else {
                                  videoController = _initializeVideoPlayer(
                                      widget.post.video!);
                                  videoController!.play();
                                }
                              });
                            },
                            icon: Icon(
                              color: Colors.white,
                              // size: 40,
                              videoController!.value.isPlaying
                                  ? Icons.pause
                                  : Icons.play_arrow,
                            ),
                          ),
                        ],
                      )
                    ],
                  ),
              ],
            ),
          )),
    );
  }

  VideoPlayerController _initializeVideoPlayer(String videoUrl) {
    VideoPlayerController controller = VideoPlayerController.network(videoUrl);
    controller.initialize().then((_) {
      setState(() {});
      // controller.play();
    });
    // print(' AQUI O VIDEOOOOO $videoUrl');
    return controller;
  }
}
ListView.builder(
                        physics: const BouncingScrollPhysics(),
                        shrinkWrap: true,
                        itemCount: posts.length,
                        itemBuilder: (BuildContext context, int i) {
                          return PostItem(post: posts[i]);
                        },
                      ),

(我正在调用列表视图并在另一个类中加载数据)

flutter dart flutter-video-player
© www.soinside.com 2019 - 2024. All rights reserved.