You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:46:08