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

Flutter应用切换不同用户登录后Firestore Stream数据不刷新求助

问题根因
  • 全局变量uida仅在应用启动初始化时赋值一次,后续用户切换登录/登出操作不会触发该值更新,Stream的监听路径始终指向首次初始化时的用户ID对应路径,自然不会拉取新登录用户的数据
  • storedocs列表定义在build方法内,每次Stream刷新时都会重复添加旧数据,存在数据重复的潜在问题
  • 没有监听FirebaseAuth的登录状态变更,无法在用户登录状态切换时主动切换Firestore的监听流
修复代码
// 移除原全局uida变量
class EventScreen extends StatelessWidget { // 遵循Dart规范类名使用大驼峰
  const EventScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final authService = Provider.of<AuthClass>(context);
    // 每次build都获取最新的登录用户状态
    final currentUser = FirebaseAuth.instance.currentUser;
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: const Icon(Icons.logout),
          tooltip: 'List of your activities',
          onPressed: () {
            authService.signout();
          },
        ),
        title: const Text('Activity list'),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.add),
            tooltip: 'List of your events',
            onPressed: currentUser == null ? null : () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => const EventAdd()),
              );
            },
          ),
        ],
      ),
      // 未登录状态直接提示
      body: currentUser == null 
          ? const Center(child: Text('请先登录'))
          : StreamBuilder(
        // 动态传入当前登录用户的uid,每次刷新都会取最新用户ID生成监听流
        stream: FirebaseFirestore.instance
            .collection('events')
            .doc(currentUser.uid)
            .collection('events')
            .snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError) {
            return const Text('Something went wrong');
          }

          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Text("Loading");
          }

          return ListView(
            children: snapshot.data!.docs.map((DocumentSnapshot document) {
              Map a = document.data() as Map<String, dynamic>;
              a['id'] = document.id;
              return Container(
                  child: Card(
                      elevation: 5,
                      shape: RoundedRectangleBorder(
                          borderRadius: const BorderRadius.only(
                              bottomRight: Radius.circular(10),
                              topRight: Radius.circular(10)),
                          side: const BorderSide(width: 3, color: Colors.blueAccent)),
                      child: ListTile(
                        onTap: () {
                          var docId = Event.fromSnapshot(document);
                          Navigator.push(
                              context,
                              MaterialPageRoute(
                                  builder: (context) =>
                                      EditEvent(data: docId)));
                        },
                        leading: const Icon(Icons.description),
                        title: Text(a['title']),
                        trailing: IconButton(
                            icon: const Icon(Icons.edit),
                            onPressed: () {
                              var docId = Event.fromSnapshot(document);
                              Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) =>
                                          EditEvent(data: docId)));
                            }),
                      )));
            }).toList(),
          );
        },
      ),
    );
  }
}
额外优化建议
  • 建议在应用顶层监听FirebaseAuth.instance.authStateChanges()流,登录状态变更时自动触发页面刷新,确保build方法能取到最新的currentUser
  • 移除冗余的storedocs变量,避免每次Stream刷新重复累加数据
  • 统一遵循Dart代码规范,所有类名使用大驼峰命名

内容的提问来源于stack exchange,提问作者akhicoda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:48:03