繁体   English   中英

如何在警报对话框中构建搜索用户列表?

[英]How do I build a searched list of users inside of an alert dialog?

我目前正在尝试在警报对话框中创建一个用户搜索列表,它将根据用户的搜索输入从项目数据库中查询用户。 我在 Android Studio 中使用 Flutter 的本地语言 (Dart) 和 Firebase Cloud Firestore 执行此操作。 我有搜索栏本身工作,但出于某种原因,每当我尝试从数据库中实际获取结果时,我的代码将访问正在使用的 Streambuilder 的 stream,但永远不会触及实际的构建器,完全跳过它。 我到底做错了什么?

负责创建警报对话框的 function:

Future createAlertDialog(BuildContext context){
    String userToSearch = '';
    bool showUsers = false;
    return showDialog(context: context, builder: (context){
      return AlertDialog(
        title: const Text("Search for a user:"),
        content: StatefulBuilder(
          builder: (context, setState) => Container(
            child: CupertinoSearchTextField(
              onChanged: (value) => {
                setState(() {
                  showUsers = true;
                }),
                showUsers
                ? Expanded(
                  child: StreamBuilder(
                    stream: FireStoreMethods().searchUsers(value),
                    builder: (context, snapshot) {
                      if (snapshot.connectionState ==
                          ConnectionState.waiting) {
                        return const Center(
                          child: CircularProgressIndicator(),
                        );
                      }
                      if (snapshot.connectionState ==
                          ConnectionState.none) {
                        return const Center(child: Text("Internet error"));
                      }
                      if (snapshot.hasError) {
                        return const Center(
                          child: Text("Something  went wrong."),
                        );
                      }
                      return ListView.builder(
                        shrinkWrap: true,
                        itemCount: snapshot.data!.docs.length,
                        itemBuilder: (context, index) {
                          return ListTile(
                            onTap: () => Navigator.of(context).push(
                              MaterialPageRoute(
                                builder: (context) => ProfileScreen(
                                  uid: snapshot.data!.docs[index]['uid'],
                                ),
                              ),
                            ),
                            leading: CircleAvatar(
                              backgroundImage: NetworkImage(
                                snapshot.data!.docs[index]['photoUrl'],
                              ),
                              radius: 16,
                            ),
                            title: Text(
                              snapshot.data!.docs[index]['username'],
                            ),
                          );
                        },
                      );
                    },
                  ),
                )
                    : const Expanded(child: Text("error"))
              }
            ),
          ),
        )
      );
    });
  }

Function 负责查询数据库:

Stream searchUsers(String userInput){
    String? currentUserID = FirebaseAuth.instance.currentUser?.uid;
    //String? valueFromFirebase = '';
    Stream s = FirebaseFirestore.instance.collection('users').where('username', isGreaterThanOrEqualTo:  userInput).orderBy('username', descending: false).snapshots();
    return s;
  }

明确地说,我希望这段代码从数据库中创建一个用户列表,在警报对话框的搜索栏下,包含与当前输入匹配的用户。 我尝试调试,更改某些代码行的位置,并将我的代码与我在整个 inte.net 上找到的代码进行比较和对比。 我收到的实际结果是能够使用搜索栏并正确保存输入,但按回车键后几乎没有任何反应。 没有列表被渲染,没有错误被抛出,程序像什么都没发生一样继续运行。

您需要将StreamBuilder放在小部件树中以使其可见。 目前在onChanged内部,它只是 textFiled 的回调方法。

Future createAlertDialog(BuildContext context) {
  String userToSearch = '';
  return showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text("Search for a user:"),
          content: StatefulBuilder(
            builder: (context, setState) => Column(
              children: [
                CupertinoSearchTextField(
                  onChanged: (value) {
                    setState(() {
                      userToSearch = value;
                    });
                  },
                ),
                userToSearch.isNotEmpty
                    ? Expanded(
                        child: StreamBuilder(
                          stream: FireStoreMethods().searchUsers(userToSearch),
                          ...........
                        ),
                      )
                    : Text("Empty")
              ],
            ),
          ),
        );
      });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM