我正在尝试构建一个列表视图,当“视频”参数不为空时显示视频播放器。虽然我已经成功显示了视频播放器,但视频似乎没有正确初始化,它显示了一个黑色容器,并且只有在我设置一个按钮来初始化它时才会初始化,即使我已经在 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]);
},
),
(我正在调用列表视图并在另一个类中加载数据)