主要概念是显示包含搜索字母表的文档或字段。
搜索栏得到给定的输入,它发送到_firebasesearch()
,但在返回什么也没有出来,上面的图像是我的数据库结构,试图弄清楚一个多星期。
- 代码**
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter_search_bar/flutter_search_bar.dart';
SearchBar searchBar;
GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
class DisplayCourse extends StatefulWidget {
@override
_DisplayCourseState createState() => new _DisplayCourseState();
}
AppBar _buildAppBar(BuildContext context) {
return new AppBar(
title: new Text("FIREBASE QUERY"),
centerTitle: true,
actions: <Widget>[
searchBar.getSearchAction(context),
],
);
}
class _DisplayCourseState extends State<DisplayCourse> {
String _queryText;
_DisplayCourseState() {
searchBar = new SearchBar(
onSubmitted: onSubmitted,
inBar: true,
buildDefaultAppBar: _buildAppBar,
setState: setState,
);
}
void onSubmitted(String value) {
setState(() {
_queryText = value;
_scaffoldKey.currentState.showSnackBar(new SnackBar(
content: new Text('You have Searched something!'),
backgroundColor: Colors.yellow,
));
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
key: _scaffoldKey,
appBar: searchBar.build(context),
backgroundColor: Colors.red,
body: _fireSearch(_queryText),
);
}
}
Widget _fireSearch(String queryText) {
return new StreamBuilder(
stream: Firestore.instance
.collection('courses')
.where('title', isEqualTo: queryText)
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return new Text('Loading...');
return new ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) =>
_buildListItem(snapshot.data.documents[index]),
);
},
);
}
Widget _buildListItem(DocumentSnapshot document) {
return new ListTile(
title: document['title'],
subtitle: document['subtitle'],
);
}
- 主要概念是显示包含搜索字母表的文档排序字段**
搜索栏得到给定的输入,它发送到_firebasesearch(),但返回什么也没有出来,上面的图像是我的数据库结构,试图弄清楚一个多星期,
8条答案
按热度按时间l0oc07j21#
这听起来可能是一个荒谬的解决方案,但实际上工作得非常好,它几乎就像SQL中的Like '%'查询
在文本字段中,当您在where()isGreaterThanOrEqualTowill内键入值时,将其与大于输入的所有字符串值进行比较,如果您在结尾处连接“Z”,则isLessThan将在您的搜索关键字之后结束,并且您从firestore获得所需的结果。
我在StreamBuilder中使用了这个流,它完全按照预期工作。
限制:
1.搜索区分大小写(如果数据一致,如Type Case,则可以将searchKey转换为特定大小写)
1.你必须从第一个字母开始搜索,它不能从中间搜索
jmp7cifd2#
我说得有点晚了,但我只想分享一些我是如何实现搜索功能而不使用第三方应用程序的。我的解决方案是使用firestore直接查询。下面是代码:
例如,如果你想搜索所有包含“ab”的关键字,那么它将显示所有包含“ab”的单词(例如abcd,abde,abwe)。如果你想使自动建议搜索功能,你可以使用打印头。这可以在这个链接中找到:https://pub.dev/packages/flutter_typeahead
祝你好运。
sh7euo9m3#
您不必重建整个流,只需根据您的搜索字符串过滤流中的结果。快速,无需重建整个流,查找搜索字符串的示例,不仅从单词的开头,而且不区分大小写。
l2osamch4#
问题是您期望从firestore得到
title is equal to queryText
而不是title contains queryText
的结果。如果您想要搜索功能,您可以在类似
List<Model> model
的变量中使用get and store the firestore documents
,而不是上面存储的型号列表中的StreamBuilder
和implement search manually
。kadbb4595#
我找到的解决方案是:
“listaProcura”是列表的名称。字符串“temp”是临时字符串的名称。这样,您将在firebase数据库中保存此名称列表。如下所示:
要使用要搜索的词检索此信息:
这样,如果您搜索“one”并且名称为“Example one”,搜索将正确返回。
2ekbmq326#
这是另一个搜索代码,将在FIREBASE数据库中进行搜索
mzmfm0qo7#
如果搜索列表区分大小写,如下所示:
然后:
扩展代码:
如果列表类似于:
然后:
798qvoo88#
如此简单和快速。