【问题标题】:Flutter get VideoPlayerController url from apiFlutter 从 api 获取 VideoPlayerController url
【发布时间】:2020-11-28 08:58:46
【问题描述】:

initState api 处的颤振视频控制器尚未请求..

 void initState() {
        super.initState();
        **initializePlayer(url);**
      }

应该如何将视频控制器初始化为 init state with.. URL 是从 snapshop 获取的未来形式..

Future<void> initializePlayer({String url}) async {
    _vidController = VideoPlayerController.network(url);
    await _vidController.initialize();

    _chewieController = ChewieController(
      videoPlayerController: _vidController,
      autoPlay: true,
      looping: true,
    );
    setState(() {});
  }

body: FutureBuilder(
          future: Provider.of<ApiService>(context, listen: false)
              .getLessonDetail(
                  courseId: widget.courseId, lessonId: widget.lessonId),
          builder: (BuildContext context, AsyncSnapshot<Lesson> snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasData) {
                final lesson = snapshot.data;


                String videoUrl =
                    "${AppURL.assetFromJr}video/course_${lesson.courseId}/chapter_${lesson.chapterId}/${lesson.lessonMobileVideo}?token=$videoNetworkToken}";
                **initializePlayer(url: videoUrl);**

如何在不调用 initState 或从快照数据 url 播放视频链接的情况下播放视频..

【问题讨论】:

  • 您好,您的问题解决了吗?

标签: flutter video-player


【解决方案1】:

你应该将你的未来转移到 initState:

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
Future future;
  @override
  void initState() {
    super.initState();

    // NOTE this! we put future here instead of in the build!
   future = Provider.of<ApiService>(context, listen: false)
        .getLessonDetail(courseId: widget.courseId, lessonId: widget.lessonId);
    future.then(() async {
      _vidController = VideoPlayerController.network(url);
      await _vidController.initialize();

      _chewieController = ChewieController(
        videoPlayerController: _vidController,
        autoPlay: true,
        looping: true,
      );
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    if (_vidController == null)
      return Text('loading...');
    else
      return YourVideoWidgetUsingTheControllers(use_your_future: future);
  }
}

【讨论】:

  • 等待_vidController.initialize();不能用这条线..
  • @YeHtunZ 嗨,你解决了吗?如果是这样,您可以将此答案标记为已接受并投票:)
  • 如何在小部件构建中使用“最终未来”.. 这样做可以,但我必须在小部件构建中再次使用 api 调用.. 两次相同的 api 调用..
猜你喜欢
  • 2020-10-11
  • 2021-07-20
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2021-05-24
  • 1970-01-01
  • 2021-02-23
相关资源
最近更新 更多