【发布时间】:2019-11-04 21:42:48
【问题描述】:
要在 Flutter 中播放视频,您必须在 init() 方法中实例化其 Url。 那么如何从 Firestore 获取视频 URL 列表? 如果我以 Future 的形式从 Firestore 中检索 Url,那么视频播放器不会接受它,因为它只接受 String 而不是 Future 对象。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
class VideoScreen extends StatefulWidget {
VideoScreen({this.studentName});
final String studentName;
@override
_VideoScreenState createState() => _VideoScreenState();
}
class _VideoScreenState extends State<VideoScreen> {
VideoPlayerController videoPlayerController;
@override
void initState() {
videoPlayerController = VideoPlayerController.network('${getU()}');
super.initState();
}
@override
Widget build(BuildContext context) {
final chewieController = ChewieController(
videoPlayerController: videoPlayerController,
aspectRatio: 3 / 2,
autoPlay: true,
looping: true,
);
final playerWidget = Chewie(
controller: chewieController,
);
return playerWidget;
}
Future<String> getU() async {
var document = await Firestore.instance.collection('Students')
.document('Badri');
var url = document.get().then((documents) {
print('video url: ${documents['video']}');
return documents['video'];
}
);
return url;
}
}
错误来了 -
W/ykiddypijourna(28557): Accessing hidden method Landroid/media/AudioTrack;->getLatency()I (light greylist, reflection)
I/ExoPlayerImpl(28557): Init 77e7389 [ExoPlayerLib/2.9.6] [beryllium, POCO F1, Xiaomi, 28]
E/ExoPlayerImplInternal(28557): Source error.
E/ExoPlayerImplInternal(28557): com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to Instance of 'Future<String>'
E/ExoPlayerImplInternal(28557): at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:281)
E/ExoPlayerImplInternal(28557): at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
E/ExoPlayerImplInternal(28557): at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:885)
E/ExoPlayerImplInternal(28557): at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:381)
E/ExoPlayerImplInternal(28557): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/ExoPlayerImplInternal(28557): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/ExoPlayerImplInternal(28557): at java.lang.Thread.run(Thread.java:764)
E/ExoPlayerImplInternal(28557): Caused by: java.net.MalformedURLException: no protocol: Instance of 'Future<String>'
E/ExoPlayerImplInternal(28557): at java.net.URL.<init>(URL.java:601)
E/ExoPlayerImplInternal(28557): at java.net.URL.<init>(URL.java:498)
E/ExoPlayerImplInternal(28557): at java.net.URL.<init>(URL.java:447)
E/ExoPlayerImplInternal(28557): at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:426)
E/ExoPlayerImplInternal(28557): at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:279)
E/ExoPlayerImplInternal(28557): ... 6 more
【问题讨论】:
-
出现错误,Url 必须是字符串而不是 Future
-
请编辑您的问题以包含所有相关信息,包括确切的错误消息,以及它来自哪一行。
-
你尝试将 Future
传递给网络方法,getU 是返回 Future 而不是字符串
标签: firebase flutter firebase-storage