我正在创建一个 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)}),
我的问题:
VideoPlayerController.asset
链接到state.videoLink
?有没有办法不使用 initState 而是使用 BLoC State ?VideoPlayerController
变量保存到 BLoC 中,以便我可以通过访问 BlocBuilder
并使用它的方法来在 state.videoPlayerController
中访问它,例如 .play()
?我已经通过在 BLoC State 中创建变量并在 BlocBuilder 中访问来尝试过此操作,但它仍然无法正常运行。将此文件添加到您的项目中
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");
}),