Flutter:如何将列表传递到 Firestore where 条件

Posted

技术标签:

【中文标题】Flutter:如何将列表传递到 Firestore where 条件【英文标题】:Flutter :How to pass List to Firestore where condetion 【发布时间】:2021-09-19 17:22:37 【问题描述】:

如何将 List 作为参数传递到条件的 firestore ?让所有数据符合条件

即:-

List<String> topicList ;
getData() async 
    SharedPreferences pref = await SharedPreferences.getInstance();

    topicList = pref.getStringList("topicSymbol");
  

 Stream<QuerySnapshot> getStreamQurey(String collPath) 
    List<String> filters ;
    return db
        .collection('$collPath')
        .where('Symbol', isEqualTo: getData()) // <---- the problem is here
        .snapshots();
  

提前谢谢你

【问题讨论】:

【参考方案1】:

由于您在那里使用 await,因此您的 getData() 实际上会返回一个 Future - 而您在调用它时没有处理它。

最简单的解决方法是使 getStreamQurey 也异步:

  getData() async 
    SharedPreferences pref = await SharedPreferences.getInstance();

    return pref.getStringList("topicSymbol");
  

  Future<Stream<QuerySnapshot>> getStreamQurey(String collPath) async 
    List<String> filters ;
    return db
        .collection('$collPath')
        .where('Symbol', isEqualTo: await getData())
        .snapshots();
  

当您调用getStreamQurey 时,您需要使用await 那里的工具。

【讨论】:

我通过了 getStreamQurey StreamBuilder,当我按照你说的做时显示错误参数类型'Future>>' 不能分配给参数类型'Stream >' 当我将 topicList 传递给 isEqualTo 时,它返回 Null。但是当我设置为 isEqualTo: topicList[1] 它的工作但它只返回一个结果 正如我在回答中所说:在调用getStreamQurey 时,您也需要使用await【参考方案2】:

这种方法存在一些问题:首先,getData 是一个异步函数,并且您不是在等待从 get data 中获取返回列表。您想在 getStreamQuery 中的返回调用之前调用 await getData()。 其次,您应该使用.where('Symbol', isEqualTo: topicList) 来比较列表(这是因为 getData() 返回 null)

让我知道这是否适合你!

【讨论】:

我通过了 getStreamQurey StreamBuilder,当我按照你说的做时显示错误参数类型'Future>>' 不能分配给参数类型'Stream >' 当我将 topicList 传递给 isEqualTo 时,它返回 Null。但是当我设置为 isEqualTo: topicList[1] 它的工作但它只返回一个结果

以上是关于Flutter:如何将列表传递到 Firestore where 条件的主要内容,如果未能解决你的问题,请参考以下文章

Flutter/Dart 如何将索引从 Listview.builder 传递到项目小部件

使用 Flutter Provider 将数据传递到另一个屏幕

Flutter:如何在两个小部件之间传递相同的数据?

将 API 数据从第 1 页传递到 Flutter 上的另一个 dart 页面

Flutter:如何将变量从 StatelessWidget 传递到 StatefulWidget

如何将消息从 Flutter 传递到 Native?