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
相关产品推荐
相关产品推荐

