You need to enable JavaScript to run this app. Flutter路由传参报错:ModalRoute<Object?>?无法访问settings属性
优惠活动
大模型
产品
解决方案
定价
更多

Flutter路由传参报错:ModalRoute<Object?>?无法访问settings属性

报错原因
  • Dart 空安全机制限制:ModalRoute.of(context) 返回值为 ModalRoute<Object?>? 可空类型,在不确定值非空的情况下不能直接访问其 settings 属性,否则会触发空访问报错。
  • 类型不匹配:路由参数 arguments 的默认类型为 Object?,不能直接赋值给指定为 Map<String, dynamic> 类型的变量,需要显式做类型转换。
  • 潜在遗漏配置:你当前的路由生成器中创建 MaterialPageRoute 时没有传递 settings 参数,会导致路由参数无法正常传递到目标页面。
修复步骤
  1. 修正路由生成器参数传递逻辑
    打开route_generator.dart,在所有创建MaterialPageRoute的位置添加settings参数传递,确保路由配置和参数能正确传递到目标页面:
import 'package:flutter/material.dart';
import 'package:navigation/screens/login_screen.dart';
import 'package:navigation/screens/home_screen.dart';
import 'package:navigation/screens/about_screen.dart';

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/loginScreen':
        return MaterialPageRoute(
          settings: settings, // 新增本行
          builder: (context) => LoginScreen()
        );
      case '/homeScreen':
        return MaterialPageRoute(
          settings: settings, // 新增本行
          builder: (context) => HomeScreen()
        ); 
      case '/aboutScreen':
        return MaterialPageRoute(
          settings: settings, // 新增本行
          builder: (context) => AboutScreen()
        );
      default:
        return _errorRoute();
    }
  }

  static Route<dynamic> _errorRoute() {
    return MaterialPageRoute(builder: (context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('ERROR'),
          centerTitle: true,
        ),
        body: Center(
          child: Text('Page not found!'),
        ),
      );
    });
  }
}
  1. 修正首页参数获取逻辑
    打开home_screen.dart,修改build方法中参数获取的代码,添加空断言和类型转换:
@override
Widget build(BuildContext context) {
  // 替换原来的参数获取代码为以下两行
  final modalRoute = ModalRoute.of(context)!;
  final Map<String, dynamic> args = modalRoute.settings.arguments as Map<String, dynamic>;

  return WillPopScope(
    onWillPop: () => Future.value(false),
    child: Scaffold(
      appBar: AppBar(
        automaticallyImplyLeading: false,
        title: Text("Home"),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            "Welcome to Apps",
            style: TextStyle(
              fontSize: 20,
            ),
          ),
          // 修改此处展示用户名
          Text(
            "Hi, ${args['name']}",
            style: TextStyle(
              fontSize: 20,
            ),
          ),
          // 其余代码保持不变
        ],
      ),
    ),
  );
}

此处用!断言是因为页面是通过指定路由跳转进入的,ModalRoute.of(context)必然有值,不会出现空情况;如果需要兼容异常场景可以额外加空判断处理。

内容的提问来源于stack exchange,提问作者abet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 19:45:03