Flutter firestore 查询 WHERE 子句

问题描述 投票:0回答:1

我通过使用 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))),
            ],
          )
          )
          );
        }
      },
    );
  }
}
flutter google-cloud-firestore
1个回答
0
投票

您的第一个代码片段读取单个文档,因此您会得到一个

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 上的 代码片段中看到

© www.soinside.com 2019 - 2024. All rights reserved.