Flutter报错:List<dynamic>类型无法分配给List<Widget>参数如何解决?
Flutter 类型不匹配报错解决:
List<dynamic> 无法赋值给 List<Widget> 问题成因
Dart 的类型推断机制在未给map方法明确指定返回泛型的场景下,会默认将map转换后生成的列表推断为List<dynamic>类型,而GridView的children参数明确要求接收List<Widget>类型的参数,二者类型不匹配因此触发报错。
教程讲师运行无报错,通常是两种情况:一是讲师使用的 Flutter/Dart 版本的类型校验规则更宽松,二是讲师代码中已经提前给DUMMY_CATEGORIES定义了明确的泛型类型,类型推断能正常识别返回值为Widget类型。
解决方法
推荐优先使用前两种方案,符合Dart类型安全规范,无运行时风险:
- 方案1:给
map方法明确指定返回泛型为Widget
在调用map时补充<Widget>泛型声明,明确告知Dart转换后的元素都是Widget类型,修改后代码如下:Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('DeliMeals')), body: GridView( children: DUMMY_CATEGORIES .map<Widget>((categoryData) => CategoryItem( categoryData.title, categoryData.color, )) .toList(), - 方案2:给
DUMMY_CATEGORIES明确声明泛型类型
定义常量时补充List<Category>类型声明,帮助Dart的类型推断正常工作,修改后代码如下:const List<Category> DUMMY_CATEGORIES = const [ Category( id: 'c1', title: 'Italian', color: Colors.purple, ), Category( id: 'c2', title: 'Quick & Easy', color: Colors.red, ), ]; - 方案3:对最终列表做类型强转
如果不想修改上游代码,可以在toList()后补充类型强转声明,代码如下:.toList() as List<Widget>
内容的提问来源于stack exchange,提问作者who-aditya-nawandar
相关产品推荐
相关产品推荐

