如何初始化一个QuerySnapshot类型变量为1文档请求FireBase / Firestore与Flutter?&



我试图从一个集合中获取文档,方法FireBaseFirestore.instance.collection("users").where("name", isEqualTo : "something").get()曾经有QuerySnapshot的返回类型。

我的目标是使一个ListView或任何可以像ListView一样显示这个请求的结果。

我有这些功能:

这个是用where方法

获取文档
class DataBaseMeth {
getUserByUsername(String username) async{
return fsInstance.collection("users").where("name", isEqualTo: username).get();
}
}

这个小部件的结果是:

class SearchResultTile extends StatelessWidget {
final String username;
const SearchResultTile({
Key? key,
required this.username,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 25.0),
child: Row(
children: [
Column(
children: [
Text(
username,
),//username
],
),
)
],
),
);
}
}

最后是页面的类:

class SearchPage extends StatefulWidget {...}
class _SearchPageState extends State<SearchPage> {
DataBaseMeth dataBaseMethods = DataBaseMeth();
TextEditingController usernameSearchController = TextEditingController();
QuerySnapshot searchSnapshot; //the only way the code run is to replace the type by dynamic
initSearch(){
dataBaseMethods.getUserByUsername(usernameSearchController.text)
.then((result){
setState((){
searchSnapshot = result;
print("result : $searchSnapshot");
//print("result : ${searchSnapshot.docs[1].data.toString()}");
});
});
}
Widget searchList(){
return searchSnapshot != null ?
ListView.builder(
shrinkWrap: true,
itemCount: searchSnapshot.docs.length,
itemBuilder: (context, index) {
return SearchResultTile(
username: searchSnapshot.docs[index].data.toString(),
personalMessage: "personalMessage");
}
)
:
Container();
}
@override
void initState() {
searchList();
super.initState();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const MainAppBar(titleText: 'Search truc', mainPage: true),
body: Container(
padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
child: Column(
children: [
Row(
children: [
Expanded(
child: TextField(
controller: usernameSearchController,
decoration: textFieldInputDecoration("search username..."),
style: whiteText(),
),
),
IconButton(
onPressed: () {
initSearch();
},
icon: const Icon(Icons.search_outlined),
color: const Color(0xFFFFFFFF),
highlightColor: Colors.deepPurple,
splashColor: const Color(0xFF3A206B),
tooltip: "Search",
),
],
),
searchList()

],
),
),
);
}
}

searchSnapshot的打印结果(当我把它设置为动态时)是:I/flutter (31401): result: '_JsonQuerySnapshot'的实例

当我点击按钮时什么也没有出现。

您的fsInstance.collection("users").where("name", isEqualTo: username).get()返回Future<QuerySnapshot>而不是QuerySnapshot,所以这就是为什么您不能将其分配给QuerySnapshot searchSnapshot。你可以将它分配给Future<QuerySnapshot> searchSnapshot

这也意味着如果你想在你的UI中使用它,你必须将它包装在FutureBuilder或传递给setState()

最新更新