Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在实际搜索发生之前,在页面加载时从firestore提取的值_Flutter_Dart_Google Cloud Firestore - Fatal编程技术网

Flutter 在实际搜索发生之前,在页面加载时从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

我想知道为什么下面的代码在页面加载时从Firestore中提取值,即使我没有输入任何搜索词。如果我开始输入匹配的搜索值,我也看不到任何结果。现在情况正好相反。我希望它仅在用户输入搜索词时才从Firestore中提取值。请告知

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中提取所有值