[英]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.