【问题标题】: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"],
    );
  }

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

【问题讨论】:

    标签: firebase flutter google-cloud-firestore future flutter-futurebuilder


    【解决方案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
    猜你喜欢
    • 2021-08-04
    • 2021-02-26
    • 2021-08-22
    • 2020-11-10
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2019-02-07
    相关资源
    最近更新 更多