Flutter中使用Navigator传值报错:期望Map类型却得到Null
问题分析与解决方案
核心问题原因
你遇到的Null错误大概率来自两个场景:
- 初始路由配置错误:如果你的
main.dart中将/home设为初始路由,APP启动时会直接加载home.dart,此时没有传递任何参数,导致arguments为null。 - 参数接收时未处理空值:
build方法会多次执行,且ModalRoute.of(context)!.settings.arguments强制非空的写法在参数缺失时会直接抛出异常。
具体修复步骤
1. 检查并修正路由配置(main.dart)
确保APP启动时先加载loading页面,而不是home页面:
void main() { runApp(MaterialApp( initialRoute: '/loading', // 初始路由设为loading routes: { '/loading': (context) => Loading(), '/home': (context) => Home(), '/location': (context) => Location(), }, )); }
2. 安全接收参数(home.dart)
替换原来的强制转换代码,增加空值处理逻辑:
@override Widget build(BuildContext context) { // 安全获取参数,避免空值异常 final arguments = ModalRoute.of(context)?.settings.arguments; if (arguments != null) { data = arguments as Map; } return Scaffold( // 原有代码保持不变 ); }
或者使用更简洁的空合并运算符:
data = ModalRoute.of(context)?.settings.arguments as Map? ?? {};
3. 增加API请求错误处理(loading.dart)
防止getTime()请求失败时无法跳转到home页面:
void setupWorldTime() async { try { WorldTime instance = WorldTime(location: 'Karachi', url: 'Asia/Karachi', flag: 'pakistan.png'); await instance.getTime(); Navigator.pushReplacementNamed(context, '/home', arguments: { 'location': instance.location, 'flag': instance.flag, 'time': instance.time, }); } catch (e) { print('获取时间失败: $e'); // 可选:添加错误提示UI } }
内容的提问来源于stack exchange,提问作者Ali Ahmed
相关产品推荐
相关产品推荐

