flutter 初始化VideoPlayer时遇到延迟初始化错误

yqyhoc1h  于 2023-04-07  发布在  Flutter
关注(0)|答案(2)|浏览(628)

我希望使用VideoPlayer在屏幕上播放视频。视频需要从API中获取。下面是我的initState的外观:

@override
  void initState() {
    super.initState();
    getCandidateProfileVideo();
  }

我在有状态小部件类中有以下两个后期变量和一个全局变量:

late VideoPlayerController _controller;
late Future<void> _initializeVideoPlayerFuture;
String videoUrl = "";

getCandidateProfileVideo()实现如下:

getCandidateProfileVideo() async {
  // await call to get video from REST API, and store the response in the variable videoUrl

  _controller = VideoPlayerController.network(
        videoUrl,
      );
      _initializeVideoPlayerFuture = _controller.initialize();
      _controller.setLooping(true);
      _controller.setVolume(1.0);
}

问题

当我尝试加载屏幕时,出现以下问题:LateInitializationError:字段“_initializeVideoPlayerFuture@75490850”尚未初始化。

申请

我的代码中有什么错误导致了这个问题,以及如何解决它?

6ju8rftf

6ju8rftf1#

在异步函数中初始化对象时,不应该使用late关键字。在getCandidateProfileView()中初始化视频播放器对象是异步的。当第一帧被flutter渲染时,video_player变量不会被初始化。这就是它抛出late initialization error的原因。要解决这个问题,可以将video_player变量设置为Nullable类型。

VideoPlayerController? _controller;
Future<void>? _initializeVideoPlayerFuture;
String videoUrl = "";

无论在哪里使用VideoPlayerController _controller,请确保使用?.或“!.”可空运算符。
例如:

_controller!.play() // you can use any function you want

有关更多信息,请参阅dart's sound null safety

yeotifhr

yeotifhr2#

添加到Just a Person的答案:
如果你想继续使用你的async函数,你可以考虑使用FutureBuilder小部件,它将调用你放在future属性中的async函数,并在函数返回某个值时更新snapshot

示例:

FutureBuilder(
  future: yourAsyncFunction(), 
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return snapshot.data;
    }
    return CircularProgressIndicator();
  }
)

有关FutureBuilder的详细信息,请参阅official documentation

相关问题