Flutter 在实际搜索发生之前,在页面加载时从firestore提取的值
我想知道为什么下面的代码在页面加载时从Firestore中提取值,即使我没有输入任何搜索词。如果我开始输入匹配的搜索值,我也看不到任何结果。现在情况正好相反。我希望它仅在用户输入搜索词时才从Firestore中提取值。请告知Flutter 在实际搜索发生之前,在页面加载时从firestore提取的值,flutter,dart,google-cloud-firestore,Flutter,Dart,Google Cloud Firestore,我想知道为什么下面的代码在页面加载时从Firestore中提取值,即使我没有输入任何搜索词。如果我开始输入匹配的搜索值,我也看不到任何结果。现在情况正好相反。我希望它仅在用户输入搜索词时才从Firestore中提取值。请告知 class _ConversationsState extends State<Conversations> { String _searchTerm =''; Future<void> _signOut() async { try
class _ConversationsState extends State<Conversations> {
String _searchTerm ='';
Future<void> _signOut() async {
try {
await FirebaseAuth.instance.signOut();
} catch (e) {
print(e); // TODO: show dialog with error
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
TextFormField(
keyboardType: TextInputType.text,
decoration: InputDecoration(
border: OutlineInputBorder(), hintText: 'Search'),
onChanged: (value) {
setState(() {
_searchTerm = value.trim();
});
},
),
StreamBuilder(
stream: (_searchTerm != "") ? FirebaseFirestore.instance
.collection('users')
.where('email', arrayContains: _searchTerm )
.snapshots() : FirebaseFirestore.instance.collection("users").snapshots(),
builder: (ctx, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
}
final results = snapshot.data.docs;
print(results.length);
return ListView.builder(
shrinkWrap: true,
itemCount: results.length,
itemBuilder: (ctx, index) => Text(
results[index].data()['email'],
//chatDocs[index].data()['email'] == user.uid,
),
);
})
],
),
);
}
class\u会话状态扩展状态{
字符串_searchTerm='';
Future\u signOut()异步{
试一试{
等待FirebaseAuth.instance.signOut();
}捕获(e){
打印(e);//TODO:显示有错误的对话框
}
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
儿童:[
TextFormField(
键盘类型:TextInputType.text,
装饰:输入装饰(
边框:OutlineInputBorder(),hintText:“搜索”),
一旦更改:(值){
设置状态(){
_searchTerm=value.trim();
});
},
),
StreamBuilder(
流:(_searchTerm!=“”)?FirebaseFirestore.instance
.collection('用户')
.where('email',arrayContains:\u searchTerm)
.snapshots():FirebaseFirestore.instance.collection(“用户”).snapshots(),
生成器:(ctx,快照){
if(snapshot.connectionState==connectionState.waiting){
返回中心(
子对象:CircularProgressIndicator(),
);
}
最终结果=snapshot.data.docs;
打印(结果、长度);
返回ListView.builder(
收缩膜:对,
itemCount:results.length,
itemBuilder:(ctx,索引)=>文本(
结果[index].data()['email'],
//chatDocs[index].data()['email']==user.uid,
),
);
})
],
),
);
}
尝试在此处反转三元运算符
FirebaseFirestore.instance.collection('users')。其中('email',arrayContains:_searchTerm).snapshots():FirebaseFirestore.instance.collection('users').snapshots(),
on
FirebaseFirestore.instance.collection(“用户”).snapshots():FirebaseFirestore.instance.collection(“用户”)。其中('email',arrayContains:\u searchTerm)。snapshots()
谢谢Simon。你解决了我在这里提出的问题。但我现在想知道,为什么在我搜索特定值时,它也会拉入所有值。我不在笔记本电脑附近,所以从电话上看有点困难,但我在这里要做的是在它查询数据库之前验证\u searchTerm
,或者在stri上至少有5个字符和验证ng必须使用字段的控制器上的.isEmpty语句(如果我记得正确的话)而不是!=''完成,因为两个对象不是同一个实例,因此它可能永远不会解析为false.StreamBuilder(流:(\u searchTerm.length>=3))Simon,到现在为止,我正在这样做检查,仍然在5个字符之后,它从Firestore中提取所有值