Flutter报List<Widget>不是List<Map<String,Object>>子类型错误如何解决
问题原因
这个报错和你调用appBar的title代码无关,本质是你在其他位置把_pages这个Map列表直接传给了期望List<Widget>类型的参数(比如PageView、Scaffold的body或者底部导航对应的页面列表属性),触发了全局的类型不匹配校验,哪怕你把Map值类型改成dynamic也没用,因为整个列表的类型是List<Map>,和要求的List<Widget>完全不匹配。
解决方法
方案1(推荐,类型安全):单独定义页面配置实体类,代替Map存储
Dart是强类型语言,用实体类存储固定结构的配置比Map维护性更高,也不会出现类型推断歧义:
- 定义配置类:
class PageConfig { final Widget page; final String title; PageConfig({required this.page, required this.title}); }
- 修改变量声明:
final List<PageConfig> _pages = [ PageConfig(page: Page1(), title: 'Page1'), PageConfig(page: Page2(), title: 'Page2'), ];
- 取值调用:
// appBar取标题 title: Text(_pages[1].title), // 给需要Widget列表的参数传值时,单独提取page字段生成列表 body: PageView( children: _pages.map((config) => config.page).toList(), )
方案2:坚持用Map存储的修改方案
如果不想改动现有结构,明确Map的泛型同时,取值/传值时做对应处理即可:
// 明确Map的泛型,避免类型推断歧义 final List<Map<String, dynamic>> _pages = [ <String, dynamic>{'page': Page1(), 'title': 'Page1'}, <String, dynamic>{'page': Page2(), 'title': 'Page2'}, ]; // 取标题时做类型转换 title: Text(_pages[1]['title'] as String), // 传Widget列表时单独提取page字段 body: PageView( children: _pages.map((item) => item['page'] as Widget).toList(), )
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

