Flutter开发报错:类型'Object'未定义运算符'[]',search.dart第34行求解
报错原因
你使用的cloud_firestore依赖版本在2.0.0及以上,该版本对返回类型做了空安全适配调整:DocumentSnapshot.data()方法的返回值从之前的Map<String, dynamic>改为了Object?类型。Object类型本身未定义[]下标访问运算符,你直接对data()的返回值用["name"]、["email"]取值就会触发该编译错误。
修复方案
只需要在取值前将data()的返回值强制转换为Map<String, dynamic>类型即可,修改searchList方法里的对应代码:
Widget searchList(){ // 先加非空判断避免空异常 if(searchSnapshot == null) return const Center(child: CircularProgressIndicator()); return ListView.builder( itemCount:searchSnapshot.docs.length , itemBuilder: (context, index){ // 强制类型转换 Map<String, dynamic> docData = searchSnapshot.docs[index].data() as Map<String, dynamic>; return SearchTile( userName: docData["name"], userEmail: docData["email"], ); }); }
另外你当前的代码还有一个逻辑问题:initiateSearch方法拿到接口返回结果后没有调用setState,会导致赋值后UI不会触发刷新,搜索结果无法展示,需要调整initiateSearch代码:
initiateSearch(){ databaseMethods .getUserByUsername(searchTextEditingController.text) .then((val){ setState(() { searchSnapshot = val; }); }); }
优化建议
如果需要更稳妥的类型校验,避免运行时类型转换异常,可以预先定义用户信息的Model类,将Map转换为实体类对象再取值,代码可维护性和安全性都会更高。
内容的提问来源于stack exchange,提问作者user15881299
相关产品推荐
相关产品推荐

