【发布时间】:2021-05-22 12:46:44
【问题描述】:
我有一个从用户接收查询字符串的搜索栏,如果查询字符串为空,就像我刚刚启动搜索操作一样,它会获取帖子集合中的所有文档...如果用户开始在搜索栏中输入...它将输入的文本与firestore集合中每个文档内的字段进行比较,如果匹配...它检索匹配的文档并在屏幕上预览它们,如果用户删除了他输入的查询字符串...所以查询字符串再次为空......所以它再次获取所有文档......我使用提供程序包将查询字符串执行到数据库获取功能,如下所示:
提供者:
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)当用户开始在搜索栏中输入时...这是否意味着所有获取的数据都丢失了...并且我们正在通过过滤再次进行新读取?...或者它只是过滤我的内容'已经从一开始就从启动搜索操作中获取?
3)当用户删除查询字符串并取消过滤并且查询字符串现在为空时...这是否意味着我将再次对云集合进行新的完整读取...所以每次用户键入或删除我再次遍历所有集合的查询字符串?*
如果问题太长,请执行我...但它更接近理论概念而不是代码...
任何澄清将不胜感激......
非常感谢。
【问题讨论】:
-
您应该尝试在 Firebase 实时数据库和 Cloud Firestore 之间混合数据。
-
是的,为什么不......但是这种组合的主要好处是什么?!......每个帖子都将包含我存储在云 Firestore 集合“帖子”中的数据......和多媒体文件,我通过帖子 ID 将它们存储在 Firebase 存储中......所以每个帖子都会一路获取其多媒体文件......在这里使用 Firebase 实时数据库的主要好处是什么?
-
混合的好处是 Firebase 实时数据库不会根据数据被读取、写入或删除的次数计算价格。因此,通过将您的一些数据转移到 RTDB,您的多次读取、写入将被保存。
-
我明白了……不知道 RTBD 是这样计算的……我会彻底检查 RTDB 并比较账单将如何受到这种转变的影响……再次感谢为我指出这个方向:)
标签: firebase flutter dart google-cloud-firestore