Flutter开发报错:List<dynamic>不是List<Widget>的子类型,求解决
解决Firestore StreamBuilder中List与List的类型不匹配问题
嘿,这个类型不匹配的问题我之前在做Firestore列表渲染时也踩过坑!其实原因很简单:Dart的类型推断在这里没有明确识别出map操作返回的是Widget列表,默认生成了List<dynamic>,而ListView的children参数要求严格的List<Widget>类型,所以就触发了这个报错。
下面给你两种靠谱的解决方法:
方法一:给map方法指定泛型类型
直接在map后面加上<Widget>,明确告诉Dart我们要生成的是Widget类型的迭代器,这样toList()后自然就是List<Widget>了:
Widget _buildBody(BuildContext context) { return StreamBuilder( stream: _getEventStream(), builder: (context, snapshot) { if (!snapshot.hasData) return const Text('Loading...'); return ListView( // 明确指定map的泛型为Widget children: snapshot.data!.documents.map<Widget>((document) { return ListTile( title: Text(document['name']), subtitle: const Text("Class"), ); }).toList(), ); }, ); }
方法二:用cast()强制转换列表
如果不想修改map的泛型,也可以在toList()之后调用cast<Widget>(),把动态列表强制转换为Widget列表:
Widget _buildBody(BuildContext context) { return StreamBuilder( stream: _getEventStream(), builder: (context, snapshot) { if (!snapshot.hasData) return const Text('Loading...'); return ListView( children: snapshot.data!.documents.map((document) { return ListTile( title: Text(document['name']), subtitle: const Text("Class"), ); }).toList().cast<Widget>(), // 强制转换类型 ); }, ); }
额外提示
代码里的snapshot.data!是针对启用了null安全的Flutter版本,如果你的项目还没升级null安全,可以去掉后面的!符号。
内容的提问来源于stack exchange,提问作者Arash
相关产品推荐
相关产品推荐

