Flutter访问QuerySnapshot数据时报The method '[]'调用错误如何解决?
报错原因
该报错和searchSnapshot的非空判断无关,是因为Cloud Firestore 中DocumentSnapshot.data()方法的返回值类型为Map<String, dynamic>?,本身是可空类型,未做判空的前提下直接调用[]取值就会触发空安全校验报错。
解决方案
你可以根据你的业务场景选择以下任意一种方案:
方案1:空断言(适合100%确定文档存在对应数据的场景)
给data()方法的返回值加!强制判定为非空,修改后的代码如下:userName: searchSnapshot.docs[index].data()!["name"], userEmail: searchSnapshot.docs[index].data()!["email"]方案2:条件调用+默认值(最安全,避免运行时崩溃)
用?.做条件调用,取值为空时返回预设的默认值,代码如下:userName: searchSnapshot.docs[index].data()?["name"] ?? "未知用户名", userEmail: searchSnapshot.docs[index].data()?["email"] ?? "未知邮箱"方案3:强转类型后取值(适合确定数据结构的规范写法)
先将返回值强转为非空的Map类型,再进行取值,代码如下:itemBuilder: (context, index) { final userData = searchSnapshot.docs[index].data() as Map<String, dynamic>; return SearchTile( userName: userData["name"], userEmail: userData["email"] ); }
额外优化建议
你当前用late QuerySnapshot searchSnapshot;声明变量,late修饰的变量默认属于非空类型,后续再做searchSnapshot != null的判断没有实际意义,建议将声明修改为QuerySnapshot? searchSnapshot;,避免运行时出现LateInitializationError异常。
内容的提问来源于stack exchange,提问作者Agnelo Fernandes
相关产品推荐
相关产品推荐

