Flutter中如何正确捕获Firestore权限拒绝异常?
Firestore权限拒绝时Flutter应用无响应问题
这不是Firestore规则的问题,规则运行符合预期。但当规则触发返回PermissionDenied时,我的Flutter应用完全没响应。我试过用try/catch包裹整个逻辑,也试过onError和catchError方法,但Dart完全不处理错误,程序直接卡顿。下面的代码同时用了catchError和try/catch,但还是拿不到有效的调试信息:
try { FirebaseFirestore.instance .collection('profiles') .withConverter( fromFirestore: Profile.fromFirestore, toFirestore: Profile.toFirestore) .doc(FirebaseAuth.instance.currentUser!.uid) .get() .catchError((e) => (throw e)) .then((value) { _userProfile = value.data(); }); } catch (w) { CustomNavigator.instance.navigatorKey.currentState! .pushNamedAndRemoveUntil("/login", (r) => false); }
问题原因
当前代码的try/catch只能捕获同步代码的错误,但get()是异步Future操作,它的错误不会被外层的try/catch捕获。而且catchError((e) => throw e)只是把错误重新抛出,没有实际处理,最终会导致未捕获的Future错误,引发应用卡顿。
解决方法
方法1:使用async/await(推荐)
将代码放在async函数中,用await等待Future完成,这样try/catch就能正常捕获异步错误:
// 确保当前函数标记为async try { final value = await FirebaseFirestore.instance .collection('profiles') .withConverter( fromFirestore: Profile.fromFirestore, toFirestore: Profile.toFirestore) .doc(FirebaseAuth.instance.currentUser!.uid) .get(); _userProfile = value.data(); } catch (w) { // 此处可捕获到PermissionDenied等Firestore错误 CustomNavigator.instance.navigatorKey.currentState! .pushNamedAndRemoveUntil("/login", (r) => false); }
方法2:正确使用catchError
如果不想用async/await,需在Future链中直接处理错误,不要重新抛出:
FirebaseFirestore.instance .collection('profiles') .withConverter( fromFirestore: Profile.fromFirestore, toFirestore: Profile.toFirestore) .doc(FirebaseAuth.instance.currentUser!.uid) .get() .then((value) { _userProfile = value.data(); }) .catchError((e) { // 直接在这里处理错误逻辑 print('Firestore错误详情:$e'); // 可添加日志方便调试 CustomNavigator.instance.navigatorKey.currentState! .pushNamedAndRemoveUntil("/login", (r) => false); });
额外提示
- 建议在错误处理中打印错误信息,便于定位问题
- 注意
FirebaseAuth.instance.currentUser可能为null,最好先做非空判断,避免空指针异常
内容的提问来源于stack exchange,提问作者meteorainer
相关产品推荐
相关产品推荐

