Flutter+Firebase Firestore报NoSuchMethodError:调用null的id属性求助
Flutter Firebase Firestore 报错排查:NoSuchMethodError: The getter 'id' was called on null
错误栈追踪
E/flutter (13517): [ERROR:flutter/shell/common/shell.cc(93)] Dart Unhandled Exception: NoSuchMethodError: The getter 'id' was called on null. E/flutter (13517): Receiver: null E/flutter (13517): Tried calling: id, stack trace: #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:38:5) E/flutter (13517): #1 EnterpriseFirebaseApi.fetchEnterprisesByUser (package:paprika_app/authentication/services/enterprise_services.dart:22:42) E/flutter (13517): #2 AuthenticationRepository.fetchEnterprisesByUser (package:paprika_app/authentication/resources/authentication_repository.dart:33:30) E/flutter (13517): #3 AuthenticationBloc._fetchEnterprisesByUser (package:paprika_app/authentication/blocs/authentication_bloc.dart:143:10) E/flutter (13517): #4 AuthenticationBloc.userLogged.<anonymous closure> (package:paprika_app/authentication/blocs/authentication_bloc.dart:103:15) E/flutter (13517): <asynchronous suspension> E/flutter (13517): #5 AuthenticationBloc.userLogged (package:paprika_app/authentication/blocs/authentication_bloc.dart:99:5) E/flutter (13517): <asynchronous suspension>
对应报错代码片段
来自EnterpriseFirebaseApi.fetchEnterprisesByUser方法第22行:
/// Looking for enterprises with this user await FirebaseFirestore.instance .collection('enterprises_users') .where('userId', isEqualTo: user.id) .where('state', isEqualTo: 'A') .get() .then((docs) { docSnapshotList.addAll(docs.docs); });
问题原因
错误直接指向代码中的user.id——此时user对象为null,调用其id属性触发了空指针异常。说明调用fetchEnterprisesByUser方法时,传入的user参数是空值。
解决方案
- 添加参数非空校验
在fetchEnterprisesByUser方法开头加入空值判断,提前拦截异常:
// 假设方法定义为 Future<List<...>> fetchEnterprisesByUser(User? user) if (user == null) { // 抛出明确错误或返回空结果,根据业务需求选择 throw ArgumentError("user参数不能为空"); // 或者 return []; } // 后续执行原Firestore查询逻辑
- 追溯调用链路
检查AuthenticationBloc._fetchEnterprisesByUser到fetchEnterprisesByUser的调用过程,确认传递的user是否已正确初始化:
- 确认是否从Firebase Auth获取到了有效的用户实例(比如
FirebaseAuth.instance.currentUser是否不为null) - 避免在用户未完成登录流程时调用该查询方法
- 利用Dart空安全强制非空
将fetchEnterprisesByUser的user参数声明为非空类型,编译阶段就阻止空值传入:
Future<List<DocumentSnapshot>> fetchEnterprisesByUser(required User user) { // 方法逻辑 }
内容的提问来源于stack exchange,提问作者Vishvam Moliya
相关产品推荐
相关产品推荐

