无法无条件访问属性“docs”,因为接收到的可能为“null” Flutter

mon*_*zim 14 dart firebase flutter dart-null-safety

迁移到空安全后显示此错误。我现在应该怎么做?

  Widget chatMessages() {
    return StreamBuilder(
        stream: messageStream,
        builder: (context, snapshot) {
          return snapshot.hasData
              ? ListView.builder(
                  padding: EdgeInsets.only(bottom: 70, top: 16),
                  itemCount: snapshot.data.docs.length,
                  reverse: true,
                  itemBuilder: (context, index) {
                    DocumentSnapshot ds = snapshot.data.docs[index];
                    return chatMessageTitle(
                        ds["message"], myUserName == ds["sendBy"]);
                  })
              : Center(child: CircularProgressIndicator());
        });
  }
Run Code Online (Sandbox Code Playgroud)

添加空检查 (!) 后显示此错误<the getter 'docs' is not Define for the type of object>

              itemCount: snapshot.data!.docs.length,
              reverse: true,
              itemBuilder: (context, index) {
                DocumentSnapshot ds = snapshot.data!.docs[index];
Run Code Online (Sandbox Code Playgroud)

Nav*_*h P 21

你必须转换snapshot.data成它的类型。假设类型是QuerySnapshot(将其更改为 的实际类型snapshot.data)。

(snapshot.data! as QuerySnapshot).docs.length
Run Code Online (Sandbox Code Playgroud)

stream我们可以在 中指定 的类型,而不是在所有位置进行类型转换StreamBuilder

StreamBuilder<QuerySnapshot>(
  ...
);
Run Code Online (Sandbox Code Playgroud)

现在snapshot.data推断QuerySnapshot不需要类型转换。

snapshot.data!.docs.length
Run Code Online (Sandbox Code Playgroud)


Ale*_*ina 8

我通过添加 StreamBuilder 和构建器(上下文,AsyncSnapshot 快照)解决了我的问题。

 Widget chatMessages() {
     return StreamBuilder<QuerySnapshot>(
        stream: messageStream,
        builder: (context, AsyncSnapshot snapshot) {
       return snapshot.hasData
          ? ListView.builder(
              padding: EdgeInsets.only(bottom: 70, top: 16),
              itemCount: snapshot.data.docs.length,
              reverse: true,
              itemBuilder: (context, index) {
                DocumentSnapshot ds = snapshot.data.docs[index];
                return chatMessageTitle(
                    ds["message"], myUserName == ds["sendBy"]);
              })
          : Center(child: CircularProgressIndicator());
    });
 }
Run Code Online (Sandbox Code Playgroud)


Cop*_*oad 7

有以下几种解决方案: