Firebase 搜索特征流重构

Firebase 搜索特征流重构,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我正在尝试重构它,因为我已经将SearchService()更改为流 .then当然给出了方法“.then”不是为类型“Stream”定义的 一个非常“新手”的问题,但我不确定为流重写它的正确方法是什么 SearchService().searchByName(value, context).then((QuerySnapshot docs) { if(queryResultSet.length==0&&value.length==1){ SearchService().searchByN

我正在尝试重构它,因为我已经将
SearchService()
更改为流

.then
当然给出了
方法“.then”不是为类型“Stream”定义的

一个非常“新手”的问题,但我不确定为流重写它的正确方法是什么

  SearchService().searchByName(value, context).then((QuerySnapshot docs) {
if(queryResultSet.length==0&&value.length==1){
SearchService().searchByName(值、上下文)。然后((QuerySnapshot文档){
对于(int i=0;i

类搜索服务{
流搜索名称(
字符串搜索字段,BuildContext(上下文)异步*{
final uid=等待(context.auth.getCurrentUID()的提供程序;
yield*FirebaseFirestore.instance
.收集(“用户数据”)
.doc(uid)
.收集(“联系人”)
.where('searchKey',
isEqualTo:searchField.substring(0,1.toUpperCase())
.快照();
}
}

如果您希望从数据库查询中得到一个结果,而不是一个随时间变化的结果流,请使用
get()
而不是
snapshots()
。它将返回一个按您期望的方式工作的未来。如中所示


阅读以下内容:@julemand101 I haveOk,你是否知道你的问题没有多大意义,因为流是一个潜在的无休止的事件序列,而不仅仅是像Future这样的单一值?因此,对于流,你将使用例如listen来订阅事件。请编辑问题,解释如果你调用
,那么会发生什么
在流上。
然后
与Futures一起用于为单个操作获取单个值。流随时间产生多个值。因此它们不是真正兼容的概念。正如在几次评论中提到的,流和Futures是不兼容的概念。这不是简单的“重写”。如果看不到
SearchService().searchByName()
的作用,我们就无法真正告诉您需要做什么。您必须从流中找出您需要的是一个值,而不是一系列值-我们不知道您需要什么。
if (queryResultSet.length == 0 && value.length == 1) {
  SearchService().searchByName(value, context).then((QuerySnapshot docs) {
    for (int i = 0; i < docs.docs.length; ++i) {
      queryResultSet.add(docs.docs[i].data());
    }
  });
class SearchService {
Stream<QuerySnapshot> searchByName(
  String searchField, BuildContext context) async* {
final uid = await TheProvider.of(context).auth.getCurrentUID();
yield* FirebaseFirestore.instance
    .collection("userData")
    .doc(uid)
    .collection("Contacts")
    .where('searchKey',
        isEqualTo: searchField.substring(0, 1).toUpperCase())
    .snapshots();
}
}
FirebaseFirestore.instance
    .collection("userData")
    .doc(uid)
    .collection("Contacts")
    .where('searchKey',
        isEqualTo: searchField.substring(0, 1).toUpperCase())
    .get();