我通过使用 firestore 文档 ID 选择文档来运行以下代码:
final DocumentReference docRef = FirebaseFirestore.instance
.collection("table_name").doc(routeData['id']);
但是,如果我将该行替换为下面的行以按字段名称搜索,则会中断:
final Query docRef = FirebaseFirestore.instance.collection("table_name")
.where("id",isEqualTo: "gze1thwyhreqpbspu611aa3ejmhemxkthphyq3kugp5vqm75fwv");
并给出以下错误:
lib/main.dart:143:22:错误:参数类型“Future
>”无法分配给参数类型“Future >?”。
请你帮我解决一下吗?
这是代码:
class ItemDetails extends StatelessWidget {
Map routeData = {};
@override
Widget build(BuildContext context) {
routeData = ModalRoute
.of(context)
?.settings
.arguments as Map;
print(routeData);
// final DocumentReference docRef = FirebaseFirestore.instance.collection("jet").doc(routeData['id']);
final Query docRef = FirebaseFirestore.instance.collection("table_name").where("id",isEqualTo: "gze1thwyhreqpbspu611aa3ejmhemxkthphyq3kugp5vqm75fwv");
return FutureBuilder<DocumentSnapshot>(
future: docRef.get(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Scaffold(
appBar: AppBar(
title: Text("Waiting for future..."),
// title: Text(data?["name"]),
),
body: Center(child: CircularProgressIndicator()),
);
} else if (snapshot.hasError) {
return Scaffold(
appBar: AppBar(
title: Text("Error"),
),
body: Center(child: Text("Error: ${snapshot.error}")),
);
} else {
print(snapshot.data!.data());
final data = snapshot.data!.data() as Map<String, dynamic>;
return Scaffold(
appBar: AppBar(
title: Text(data?["name"]),
),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
// reg, type, country, dlastupd
children: [
Text("Region: " + data?["reg"]),
Text("Country: " + data?["country"]),
Text("Type: " + data?["type"]),
Text("Last updated (red text): " + DateFormat('d MMMM y').format(DateTime.fromMillisecondsSinceEpoch(data?['dlastupd'] * 1000))),
],
)
)
);
}
},
);
}
}
您的第一个代码片段读取单个文档,因此您会得到一个
DocumentSnapshot
作为结果。
您的第二个代码片段执行一个查询,这可能会产生多个文档,因此您会得到一个
QuerySnapshot
作为结果。
这两种类型并不相同,因此您的代码需要以不同的方式处理它们。
首先你需要改变
return FutureBuilder<DocumentSnapshot>(
致:
return FutureBuilder<QuerySnapshot>(
然后您需要更改处理数据的方式,因为您现在可以获得多个文档。
如果您自己知道最多只能有一个结果文档,则可以执行此操作以仅处理来自
QuerySnapshot
的单个文档:
} else {
var querySnapshot = snapshot.data!
var docs = querySnapshot.docs;
final data = docs[0].data() as Map<String, dynamic>;
...
如果可能有多个结果,您需要更改代码来处理这些多个结果。我通常使用
ListView.builder
来实现这一点,例如您可以在 Zapp.run 上的 代码片段中看到