You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用Navigator传值报错:期望Map类型却得到Null

问题分析与解决方案

核心问题原因

你遇到的Null错误大概率来自两个场景:

  1. 初始路由配置错误:如果你的main.dart中将/home设为初始路由,APP启动时会直接加载home.dart,此时没有传递任何参数,导致arguments为null。
  2. 参数接收时未处理空值: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:10:20