Flutter旧版Firebase依赖适配新版实现登录后按角色跳转页面
问题解决方法
你遇到的报错是Flutter Firebase套件版本迭代后的API变更导致的,对应修改方案如下:
1. 两处API变更说明
FirebaseAuth.instance.currentUser在你使用的3.x版本firebase_auth中,已改为直接返回User?类型的同步结果,不需要调用then方法获取用户对象getDocuments()方法在2.x版本cloud_firestore中已更名为get(),同时查询返回的文档列表属性从documents改为docs,单条文档数据读取从data属性改为data()调用方法
2. 修改后的完整代码
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:webfire/admin_screen.dart'; import 'package:webfire/home_screen.dart'; class UserManagement { signOut() async { await FirebaseAuth.instance.signOut(); } Future<void> authorizeAdmin(BuildContext context) async { // 安全获取当前登录用户,避免未登录场景空异常 User? currentUser = FirebaseAuth.instance.currentUser; if (currentUser == null) { // 可在这里补充未登录跳转登录页的逻辑 return; } try { QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection('users') .where('uid', isEqualTo: currentUser.uid) .limit(1) // 加limit避免返回多余文档 .get(); if (querySnapshot.docs.isNotEmpty) { Map<String, dynamic> userData = querySnapshot.docs.first.data() as Map<String, dynamic>; String role = userData['role'] ?? 'user'; if (role == 'admin' && context.mounted) { Navigator.push(context, MaterialPageRoute(builder: (context) => const AdminScreen())); } else if (context.mounted) { Navigator.push(context, MaterialPageRoute(builder: (context) => const HomeScreen())); } } } catch (e) { // 可在这里补充错误提示逻辑 debugPrint('获取用户角色失败: $e'); } } }
3. 额外优化建议
如果你的users集合的文档ID直接使用用户uid存储,可将查询逻辑替换为以下写法,查询性能更高:
DocumentSnapshot docSnapshot = await FirebaseFirestore.instance.collection('users').doc(currentUser.uid).get(); if (docSnapshot.exists) { Map<String, dynamic> userData = docSnapshot.data() as Map<String, dynamic>; // 后续角色判断逻辑和上述代码一致 }
内容的提问来源于stack exchange,提问作者user3030327
相关产品推荐
相关产品推荐

