错误:无法无条件调用方法“[]”,因为接收者可以为“null”

时间:2021-05-20 20:11:52

标签: flutter dart dart-null-safety

我刚刚转换了我的项目 Null Safety,但出现错误提示

The method '[]' can't be unconditionally invoked because the receiver can be 'null'. Try making the call conditional (using '?.') or adding a null check to the target ('!').   

我有点迷惑我不知道该怎么办。

 return ListView.builder(
                                    scrollDirection: Axis.horizontal,
                                    itemCount: snapshot.data['Interest'].length ,// i am getting error here
                                    itemBuilder: (context, index) {
                                      return Padding(
                                        padding: const EdgeInsets.only(top: 12.0),
                                        child: bottomCardList(
                                            'assets/1 (6).jpeg',
                                            snapshot.data['Interest'][index]// i am getting error here
                                                .toString(),
                                            () {}),
                                      );
                                    });
                              }),

谢谢

1 个答案:

答案 0 :(得分:0)

发生的情况是,在切换到空安全之后,您不能直接使用可以为空的变量编写语句,而不检查它们是否为空。在这种情况下,变量 snapshot.data 可以为 null,因此您必须相应地编写代码。尝试将您的代码转换为:

return ListView.builder(
  scrollDirection: Axis.horizontal,
  itemCount: snapshot.data!['interest'].length,
  // i am getting error here
  itemBuilder: (context, index) {
    return Padding(
      padding: const EdgeInsets.only(top: 12.0),
      child: bottomCardList(
        'assets/1 (6).jpeg',
        snapshot.data?['Interest'][index] // i am getting error here
            .toString(),
      ),
    );
  },
);

现在,有了这个,您的 itemCount 错误应该会消失(如果没有,请更新您的 cloud_firestore 插件,它不是空安全的)。至于您在bottomCardList 中遇到的错误,这取决于您的bottomCardList 参数是否为空安全。如果bottomCardList 的类型为bottomCardList(String someVar, String someOtherVar),则可以将其更改为bottomCardList(String someVar, String? someOtherVar)。然后,在您的 bottomCardList 代码中,您必须确保处理 someOtherVar 可以为 null 的情况。

您可以查看此视频以了解更多信息:https://www.youtube.com/watch?v=iYhOU9AuaFs


编辑 对于“未定义对象错误”:

我假设您的构建器参数类似于:

builder: (context, snapshot) {
    return ListBuilder etc. etc. 
}
                

尝试将其更改为:

builder: (context, AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> snapshot) {
    return ListBuilder etc. etc. 
}

并且错误应该消失。 DocumentSnapshot 是如果您正在执行 collection.docs.snapshots()。如果您正在执行 collection.snapshots(),请使用 QuerySnapshot 等。