我有一个搜索栏,它接收来自用户的查询字符串,如果查询字符串是空的,就像我刚刚启动搜索操作一样,它获取collection...if用户开始在bar...it中键入的所有文档,然后将其与防火墙集合中的每个文档中的字段进行比较,如果它matches...its检索匹配的文档并在屏幕上预览它们,如果用户删除了类型化查询string...so,查询字符串是空的,那么它将再次获取所有文档……我使用提供程序包将查询字符串传递到数据库获取函数,如下所示:
提供商:
import 'package:flutter/foundation.dart';
class QueryStringProvider extends ChangeNotifier {
String _queryString = '';
String getQueryString() => _queryString;
updateQueryString(String userQueryString) {
_queryString = userQueryString;
notifyListeners();
}
}数据库功能:
Stream<QuerySnapshot> filterAllPosts(String query) {
return query.isEmpty
? _postsCollection.snapshots()
: _postsCollection
.where('postSubtitles', arrayContains: query)
.snapshots();
}以下是包装在Consumer<QueryStringProvider>中的流生成器,Streambuilder接收从数据库获取函数检索的所有数据,并根据我喜欢的布局结构填充数据:
@override
Widget build(BuildContext context) {
return Container(
child: Consumer<QueryStringProvider>(
builder: (context, data, _) {
return StreamBuilder<QuerySnapshot>(
// stream: DatabaseService().listenToAllGigs(),
stream: DatabaseService().filterAllGigs(data.getQueryString()),
builder: (context, snapshot) {
return !snapshot.hasData
? Center(child: Text(''))
: snapshot.data.documents.length > 0
? ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
DocumentSnapshot data =
snapshot.data.documents[index];
Map getDocData = data.data;
return GestureDetector(
child: PostItem(
appointed: getDocData['appointed'],
appointedUserFullName:
getDocData['appointedUserFullName'],
postId: getDocData['gigId'],
postTitle: getDocData['postTitle'],
postSubtitles: getDocData['postSubtitles'],
postBody: getDocData['postBody'],
// onDeleteItem: () => model.deleteGig(index),
),
);
})
: Center(
child: Text(
'No Posts matching your criteria',
style: TextStyle(fontSize: 16),
));
},
);
},
),
);
}关于如何用上面的代码减少云读取,我有三个问题:
1)启动搜索操作时,当查询字符串为空时,是否存在获取所有文档的问题?
(2)当用户开始在搜索bar...does中输入时,这意味着我们正在用filtering?...or再次进行新的读取,这意味着所有已获取的数据都是用filtering?...or重新读取的--它只是过滤了我从从开始就开始搜索操作中获得的内容?
( 3)当用户删除查询字符串并取消筛选,查询字符串现在为empty...does时,这意味着每当用户键入或删除查询字符串时,我都会对云集合again...so进行一次新的完全读取,我再次遍历所有集合?*
请原谅我,如果这个问题太long...but,它更接近理论概念,而不是代码.
如有任何澄清将不胜感激..。
非常感谢。
发布于 2021-02-19 15:29:02
我建议的是,只有当用户输入了一些特定数量的字符,并且所有字符都是有效的时,才会查询结果。例如,在我的例子中,我确保用户输入了至少3个字符,并且它们都是字母或数字。
https://stackoverflow.com/questions/66279058
复制相似问题