firebase TypeAhead不支持Firestore Flutter

7eumitmz  于 2023-04-12  发布在  Flutter
关注(0)|答案(1)|浏览(149)

我尝试在firestore集合中实现搜索自动完成功能。该功能仅适用于从firestore查询产品的回调返回的列表的第一个元素。即使用户输入与列出的产品匹配,它也不会返回其余元素的结果。
下面是我的TypeAhead widget:

TypeAheadField<Product>(
      debounceDuration: const Duration(milliseconds: 1000),
      suggestionsCallback: (searchString) async {
        return await FirebaseCrud.getProductSuggestion(
                searchString, widget.categoryId)
            .then((value) => value.first);
      },
      itemBuilder: (context, itemData) {
        return ListTile(title: Text(itemData.productName));
      },
      onSuggestionSelected: (suggestion) {
        print(suggestion.productName);
      },
    ),

下面是我的回调实现:

static Future<Stream<List<Product>>> getProductSuggestion(
      String searchString, String categoryId) async {
    final products = FirebaseFirestore.instance
        .collection('products')
        .snapshots()
        .map((snapshot) => snapshot.docs
                .map((doc) => Product.fromJson(doc.data()))
                .takeWhile((value) {
              print('name: ${value.productName.toLowerCase()}');
              print('searched: ${searchString.toLowerCase()}');

              return value.productName
                  .toLowerCase()
                  .contains(searchString.toLowerCase());
            }).toList());

    return products;
  }

预期的行为是在用户输入时动态地建议产品。然而,它只建议用户输入是否与firestore回调返回的第一个列表项匹配。对于其余部分,即使用户输入与firestore中返回的产品回调列表中的产品匹配,它也不会显示任何结果。我似乎不知道我做错了什么。

vptzau2j

vptzau2j1#

static Future<Stream<List<Product>>> getProductSuggestion(
      String searchString, String categoryId) async {
    final products = FirebaseFirestore.instance
        .collection('products')
        .snapshots()
        .map((snapshot) => snapshot.docs
                .map((doc) => Product.fromJson(doc.data()))
                .where((value) {
              print('name: ${value.productName.toLowerCase()}');
              print('searched: ${searchString.toLowerCase()}');

              return value.productName
                  .toLowerCase()
                  .contains(searchString.toLowerCase());
            }).toList());

    return products;
  }

相关问题