Flutter报错:QueryDocumentSnapshot类型无法转为Usuario模型实例
错误原因
你存储在_usuariosFiltrados列表中的元素是Firestore返回的QueryDocumentSnapshot类型,而EditarUsuario组件要求接收的usuario参数是自定义的Usuario类型,二者类型不匹配所以抛出异常。
最优解决方案(推荐)
调整数据存储逻辑,从获取数据阶段就把快照转换为Usuario对象存储,避免后续反复转换,同时简化筛选逻辑:
- 首先修改列表的类型声明,明确存储的是
Usuario类型:
// 把原来的泛型动态列表改成指定Usuario类型 List<Usuario> _allResults = []; List<Usuario> _usuariosFiltrados = [];
- 修改Firestore数据获取逻辑,拿到快照后直接转换为
Usuario对象存入列表:
getUsuariosSnapShot() async { var data = await FirebaseFirestore.instance .collection("users") .orderBy("username") .get(); setState(() { // 遍历所有文档快照,统一转成Usuario对象 _allResults = data.docs.map((snapshot) => Usuario.fromSnapshot(snapshot)).toList(); }); searchResultsList(); return "complete"; }
- 优化筛选逻辑,无需重复调用
fromSnapshot转换对象,直接用已转换的Usuario字段判断:
searchResultsList(){ var showResults = <Usuario>[]; if(_controller.text.isNotEmpty){ var busqueda = _controller.text.toLowerCase(); for (var usuario in _allResults) { if (usuario.username.toLowerCase().contains(busqueda) || usuario.about.toLowerCase().contains(busqueda) || usuario.city.toLowerCase().contains(busqueda) || usuario.country.toLowerCase().contains(busqueda) || usuario.email.toLowerCase().contains(busqueda) || usuario.first_name.toLowerCase().contains(busqueda) || usuario.last_name.toLowerCase().contains(busqueda) || usuario.web.toLowerCase().contains(busqueda)){ showResults.add(usuario); } } } else { showResults = List.from(_allResults); } setState(() { _usuariosFiltrados = showResults; }); }
修改完成后你原来的跳转传参代码无需改动,_usuariosFiltrados[index]本身就是Usuario类型,不会再出现类型错误。
临时修复方案
如果不想改动现有存储和筛选逻辑,也可以在传参时当场把快照转换为Usuario对象:
onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (context) => EditarUsuario( // 手动把快照转成Usuario类型 usuario: Usuario.fromSnapshot(_usuariosFiltrados[index]), ),), ); }
内容的提问来源于stack exchange,提问作者mvasco
相关产品推荐
相关产品推荐

