Flutter运行触发'path.isNotEmpty'断言失败报错该如何解决?
问题原因与解决方法
报错Failed assertion: line 42 pos 16: 'path.isNotEmpty': is not true的核心触发原因是你调用Firestore的doc()方法时传入的路径为空,和你贴的setState代码没有直接关系,是上层Firestore查询逻辑的问题。
具体存在的问题点
- 你仅判断了
docRef != "NULL",没有覆盖docRef为null、空字符串的异常场景,你直接用!强制解包docRef,如果本地存储读取到的docRef是空字符串,拼接出的Firestore路径就是/User/,末尾为空就会触发path.isNotEmpty的断言报错。 - 你获取DocumentSnapshot字段的写法错误:
docsSnap![""].data()中使用空字符串作为文档字段键是无效操作,而且DocumentSnapshot取数据的正确逻辑是先调用data()方法转成Map再取值。 - 没有给Firestore异步请求加异常捕获,出现问题无法定位具体原因。
修复步骤
1. 补全docRef的校验逻辑
将getUserDetails方法的校验逻辑修改为同时判断非空、非空字符串、不等于"NULL":
Future<Null> getUserDetails() async{ isLoggedIn= await LocalStorage.sharedInstance.loadAuthStatus(Constants.isLoggedIn); docRef= await LocalStorage.sharedInstance.loadUserRef(Constants.userRef); // 先判断docRef非空、非空字符串再执行后续逻辑 if(docRef != null && docRef!.trim().isNotEmpty && docRef != "NULL"){ print('docRef :'+ docRef!); try { FirebaseFirestore.instance.doc('/User/'+docRef!).get().then((DocumentSnapshot docs) { if(docs.exists){ print("Doc found"); setState(() { docsSnap = docs; }); }else{ setState((){docsSnap=null;}); print("Doc Not Exist"); } }); } catch(e) { print("Firestore请求异常:$e"); setState((){docsSnap=null;}); } }else{ setState((){docsSnap=null;}); print("DocRef无效,不执行查询"); } }
2. 修正drawer中字段取值的写法
修改build方法中drawer的字段取值逻辑,不要使用空字符串作为键,替换为你实际的字段名即可:
drawer: docsSnap != null ? drawer( image1, context, // 正确的取值逻辑:先取data转成Map再拿对应字段 (docsSnap!.data() as Map<String,dynamic>)['profileImage'], (docsSnap!.data() as Map<String,dynamic>)['firstName']+" "+(docsSnap!.data() as Map<String,dynamic>)['lastName'], (docsSnap!.data() as Map<String,dynamic>)['email'], "true", '/User/'+docRef! ) : drawer(image1,context,'assets/icons/avatar.png','Login / Register ','','false',null),
按上述步骤修改后即可解决报错。
内容的提问来源于stack exchange,提问作者Anders Tyree
相关产品推荐
相关产品推荐

