flutter - 如何解决 getter 'value' 在颤振中被调用为 null
问题描述
我正在使用该video_player
软件包。我想加载视频。视频数据是来自 API 的响应。但我对NoSuchMethodError: The getter 'value' was called on null. Receiver: null Tried calling: value
. 我的回答没有问题。我print()
那里的回应得到了videoURL。问题是我不知道如何video_player
在得到响应后添加。我试过这样做,但有错误。
这是我的代码:
class _State extends State<MyApps> {
GlobalKey<PaginatorState> paginatorGlobalKey = GlobalKey();
String videoURL;
VideoPlayerController _videoPlayerController;
@override
void initState() {
super.initState();
playVideo(videoURL);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('My Apps'),
),
body: Paginator.listView(
key: paginatorGlobalKey,
pageLoadFuture: sendPagesDataRequest,
pageItemsGetter: listItemsGetterPages,
listItemBuilder: listItemBuilder,
loadingWidgetBuilder: loadingWidgetMaker,
errorWidgetBuilder: errorWidgetMaker,
emptyListWidgetBuilder: emptyListWidgetMaker,
totalItemsGetter: totalPagesGetter,
pageErrorChecker: pageErrorChecker,
scrollPhysics: BouncingScrollPhysics(),
),
);
}
Future<Data> sendPagesDataRequest(int page) async {
try {
String url = Uri.encodeFull("APIURL?page=$page");
http.Response response = await http.get(url);
Data pagesData = pagesDataFromJson(response.body);
return pagesData;
} catch (e) {
}
void playVideo(dynamic item) async {
_videoPlayerController = VideoPlayerController.network(item.videoURL)
..initialize().then((_) {
_videoPlayerController.play();
});
}
Widget listItemBuilder(dynamic item, int index) {
videoURL= item.videoURL;
return InkWell(
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
elevation: 4,
margin: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Stack(
children: <Widget>[
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
_videoPlayerController.value.initialized
? AspectRatio(
aspectRatio: _videoPlayerController.value.aspectRatio,
child: VideoPlayer(_videoPlayerController),
)
: Container()
],
),
),
],
),
),
);
}
我的代码中有什么错误,我该如何解决?
解决方案
您应该将从方法返回的 Future 存储VideoPlayerController.initialize
在 State Class 变量中:
Future hasInitialized;
void playVideo(dynamic item) async {
_videoPlayerController = VideoPlayerController.network(item.videoURL);
hasInitialized = initialize();
hasInitialized.then((_) {
_videoPlayerController.play();
});
}
然后,您可以使用FutureBuilder 类来构建一个小部件,具体取决于Future 是否已完成。
问题是我不知道如何在得到响应后添加 video_player。
connectionState
这个 Widget 可以通过使用或snapshot.hasData
(在非 void Futures 的情况下)属性返回不同的东西,无论 Future 是否已完成。
FutureBuilder(
future: hasInitialized,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// Return here what you want to display.
} else {
// Return here what you want to show when the VideoPlayerController is still initializing, like a
// loading spinner.
return Center(child: CircularProgressIndicator());
}
},
)
有关更多信息,请参阅官方食谱。
推荐阅读
- scala - Any 对象的类型转换:模式匹配 vs Try()
- java - org.hamcrest.Matcher 类型无法解析。它是从所需的 .class 文件中间接引用的
- http - Arduino MKGSM 中的 HTTP POST 到 Eventhub
- java - 与其他修改内容的方式相比,使用 Sling Pipes 有哪些优势?
- .net - EFCore 2.1 动态 SQL 参数
- gradle - Android studio gradle 同步
- python - 如何在 Selenium 中等待 iframe 页面加载?
- python - 两个不同数据库的微服务通过api rest的关系
- c# - 检测 TCP Server 中两个对象之间的视线和距离
- timestamp - AWS Redshift:[Amazon](500339) TiMESTAMP 的意外错误