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 无法使用热重载
使用 Mockito 的 FutureBuilder 快照数据为空 - Flutter