Flutter中如何将变量传入FirebaseFirestore的Where查询子句
解决Firestore查询中变量替换硬编码字符串的问题
你的核心问题是全局final变量_referenceMemberList初始化时机过早,它在Widget实例创建前就被定义,根本拿不到MemberListHome传入的chapterName变量,所以只能用硬编码字符串。按照下面的步骤修改代码即可解决:
修改步骤
- 移除全局查询变量,移到State类内:把原来的全局
_referenceMemberList删掉,在_MemberListHomeState里声明Query类型的实例变量,在initState中根据widget.chapterName动态构建查询。 - 修正StatefulWidget的参数声明:原来的
chapterName声明会用默认空字符串覆盖传入值,改成带类型的final变量。 - 动态初始化数据流:在
initState里基于动态创建的查询生成快照流。
修改后的完整代码
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:member_shmc_app/screens/home/members/members_admin/admin_member_details.dart'; //New starting point -- need to change to filter by User's Chapter Members ONLY //Attempt to take HomePage and pass in ChapterName // ignore: must_be_immutable class MemberListHome extends StatefulWidget { MemberListHome({required this.chapterName, super.key}); final String chapterName; // 修正为final带类型的参数 @override State<MemberListHome> createState() => _MemberListHomeState(); } class _MemberListHomeState extends State<MemberListHome> { late Stream<QuerySnapshot> _streamMemberItems; late Query<Map<String, dynamic>> _referenceMemberList; // 移到State类内 @override void initState() { super.initState(); // 在这里根据widget.chapterName构建查询 _referenceMemberList = FirebaseFirestore .instance .collection('shmc_members') .where('memberChapter', isEqualTo: widget.chapterName); _streamMemberItems = _referenceMemberList.snapshots(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("SHMC Chapter Members"), backgroundColor: const Color.fromARGB(255, 43, 55, 138), foregroundColor: Colors.white), body: StreamBuilder<QuerySnapshot>( stream: _streamMemberItems, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasError) { return Center(child: Text(snapshot.error.toString())); } if (snapshot.connectionState == ConnectionState.active) { QuerySnapshot querySnapshot = snapshot.data; List<QueryDocumentSnapshot> listQueryDocumentSnapshot = querySnapshot.docs; return ListView.builder( itemCount: listQueryDocumentSnapshot.length, itemBuilder: (context, index) { QueryDocumentSnapshot document = listQueryDocumentSnapshot[index]; return MemberListItem(document: document); }); } return const Center(child: CircularProgressIndicator()); }, ), ); } } class MemberListItem extends StatefulWidget { const MemberListItem({ super.key, required this.document, }); final QueryDocumentSnapshot<Object?> document; @override State<MemberListItem> createState() => _MemberListItemState(); } class _MemberListItemState extends State<MemberListItem> { @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(5.0), child: ListTile( tileColor: Colors.white, minLeadingWidth: 10, onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => AdminMemberDetails(widget.document.id))); }, title: Text(widget.document['memberRoadname'] + ' - ' + widget.document['memberChapter']), subtitle: Text(widget.document['memberFullName'] + " - " + widget.document['memberCellPhone']), //leading: Image.asset('images/chapters/' + widget.document['chapterLogo']), ), ); } }
额外说明
如果需要支持chapterName动态变化(比如用户切换章节),可以把查询逻辑移到didUpdateWidget方法里,当widget.chapterName变化时重新构建查询并更新数据流:
@override void didUpdateWidget(covariant MemberListHome oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.chapterName != widget.chapterName) { _referenceMemberList = FirebaseFirestore .instance .collection('shmc_members') .where('memberChapter', isEqualTo: widget.chapterName); setState(() { _streamMemberItems = _referenceMemberList.snapshots(); }); } }
内容的提问来源于stack exchange,提问作者Amnesia GrayGhost
相关产品推荐
相关产品推荐

