FutureBuilder : 方法 '&' 在 null 上被调用

Posted

技术标签:

【中文标题】FutureBuilder : 方法 \'&\' 在 null 上被调用【英文标题】:FutureBuilder : The method '&' was called on nulFutureBuilder : 方法 '&' 在 null 上被调用 【发布时间】:2021-11-30 23:47:47 【问题描述】:

我只需要从 Firestore 检索一个文档并将其数据存储在一个名为 Artista 的自定义类中。

为了达到这个目的,我使用了FutureBuilder。它的用法对我来说不是很清楚,但我认为我使用它很好,问题是我猜是如何读取文档数据,因为当FutureBuilder 被调用时,这是错误:

The method '&' was called on null.
Receiver: null
Tried calling: &(4294967295)

我认为我没有以正确的方式读取快照数据,所以问题应该是 Artista.fromDocumentSnapshot 工厂方法,但我会放整个代码。

重要信息是:cloud_firestore: ^2.4.0

这是 StreamBuilder :

FutureBuilder<DocumentSnapshot<Map<String, dynamic>>>(
          future: widget.database.getFutureArtistById(widget.name),
          builder: (BuildContext context,
              AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> snapshot) 
            if (snapshot.hasError) 
              return const Text('Error');
             else if (snapshot.hasData && !(snapshot.data.exists)) 
              return Text("User does not exist");
             else if (snapshot.connectionState == ConnectionState.done &&
                snapshot.data.exists &&
                snapshot.data != null) 
              Artista artistaTrovato = Artista.fromDocumentSnapshot(snapshot);
              if (artistaTrovato != null) 
                print(artistaTrovato.toString());
              
              return Artists_Showroom(
                  artistaCorrente: widget.artista,
                  database: widget.database,
                  lista: [artistaTrovato]);
             else if (!snapshot.hasData)
              return Center(
                  child: Container(
                child: Text("No user found"),
              ));
            else
              return Center(
                child: CircularProgressIndicator(),
              );
          ),

这是要解决的未来:

Future<DocumentSnapshot<Map<String, dynamic>>> getFutureArtistById(
      String id) async 
    return await FirebaseFirestore.instance
        .collection("ids")
        .doc("tabs")
        .collection(id[0])
        .doc(id)
        .get();
  

这是读取快照的方法(Artista.fromDocumentSnapshot):

factory Artista.fromDocumentSnapshot(
      AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> doc) 
    return Artista(
      bio: doc.data.data()["bio"],
      regione: doc.data.data()["regione"],
      citta: doc.data.data()["citta"],
      comune: doc.data.data()["comune"],
      foto: doc.data.data()["foto"],
      nome: doc.data.data()["nome"],
      settore: doc.data.data()["settore"],
      lavoro: doc.data.data()["lavoro"],
      progetti: doc.data.data()["progetti"],
      id: doc.data.data()['id'],
      posts: doc.data.data()["posts"],
    );
  

我读得好吗?有什么想法吗?

【问题讨论】:

【参考方案1】:

下面的代码应该可以工作。我更改了条件优先级;

if (snapshot.connectionState == ConnectionState.done &&
                 snapshot.data.exists && snapshot.data != null
                )

新的

if (snapshot.connectionState == ConnectionState.done &&
                snapshot.data != null && snapshot.data.exists
                )
FutureBuilder<DocumentSnapshot<Map<String, dynamic>>>(
          future: widget.database.getFutureArtistById(widget.name),
          builder: (BuildContext context,
              AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> snapshot) 
            if (snapshot.hasError) 
              return const Text('Error');
             else if (snapshot.hasData && !(snapshot.data.exists)) 
              return Text("User does not exist");
             else if (snapshot.connectionState == ConnectionState.done &&
                snapshot.data != null && snapshot.data.exists
                ) 
              Artista artistaTrovato = Artista.fromDocumentSnapshot(snapshot);
              if (artistaTrovato != null) 
                print(artistaTrovato.toString());
              
              return Artists_Showroom(
                  artistaCorrente: widget.artista,
                  database: widget.database,
                  lista: [artistaTrovato]);
             else if (!snapshot.hasData)
              return Center(
                  child: Container(
                child: Text("No user found"),
              ));
            else
              return Center(
                child: CircularProgressIndicator(),
              );
          ),

【讨论】:

你是对的,但问题在别处,解决了,是的,它有效我读错了集合:S

以上是关于FutureBuilder : 方法 '&' 在 null 上被调用的主要内容,如果未能解决你的问题,请参考以下文章

Flutter get_it 和 FutureBuilder 无法使用热重载

Flutter FutureBuilder 返回空数据

为啥 futureBuilder 返回一个空值?

使用 Mockito 的 FutureBuilder 快照数据为空 - Flutter

Flutter:不清楚 ValueChanged 和 FutureBuilder

FutureBuilder 与 Notifylistener 冲突