Flutter中state.extra传null报错,如何实现传null并显示0?
解决GoRouter state.extra传入null的类型转换错误
问题根源在于直接使用as Map<String, dynamic>对可能为null的state.extra做强制类型转换,null不属于Map<String, dynamic>的子类型,因此触发类型错误。
最佳解决方案1:路由层处理默认值(推荐)
在路由的pageBuilder中,先允许state.extra转换为可空Map,再为score设置默认值,确保传入页面的参数永远非null:
GoRoute( path: 'settings', pageBuilder: (context, state) { // 将extra转换为可空Map,避免null强制转换报错 final map = state.extra as Map<String, dynamic>?; // 若map为null或score字段不存在/为null,返回分数为0的Score实例 final score = map?['score'] as Score ?? Score(score: 0); return buildMyTransition<void>( child: SettingsScreen( score: score, key: const Key('settings'), ), color: context.watch<Palette>().backgroundPlaySession, ); }, )
关键说明:
as Map<String, dynamic>?:允许转换结果为null,避免类型转换失败map?['score']:使用空安全访问符,当map为null时直接返回null?? Score(score: 0):空合并运算符,为null的情况设置默认值(根据你的Score类结构调整默认实例的创建方式)
最佳解决方案2:页面层处理null值
如果需要在页面内根据null状态做更多逻辑,可以让页面接收可空的Score参数,在页面内部处理默认值:
路由代码修改:
GoRoute( path: 'settings', pageBuilder: (context, state) { final map = state.extra as Map<String, dynamic>?; // 允许score为null final score = map?['score'] as Score?; return buildMyTransition<void>( child: SettingsScreen( score: score, key: const Key('settings'), ), color: context.watch<Palette>().backgroundPlaySession, ); }, )
SettingsScreen代码修改:
class SettingsScreen extends StatelessWidget { final Score? score; const SettingsScreen({super.key, this.score}); @override Widget build(BuildContext context) { // 若score为null,显示0;否则取实际分数 final displayScore = score?.scoreValue ?? 0; // 替换为你的Score类实际字段名 return Text('玩家分数:$displayScore'); } }
方案对比:
- 方案1将默认值逻辑封装在路由层,页面无需处理null,职责更单一
- 方案2把null判断交给页面,适合需要根据null状态展示不同UI的场景
内容的提问来源于stack exchange,提问作者Elena Epshtein
相关产品推荐
相关产品推荐

