首页 > 解决方案 > 如何解决 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()
            ],
            ),
           ),  
          ],
         ),
        ),
      );
    }

我的代码中有什么错误,我该如何解决?

标签: flutterdart

解决方案


您应该将从方法返回的 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());
    }
  },
)

有关更多信息,请参阅官方食谱。


推荐阅读