Flutter路由传参报错:ModalRoute<Object?>?无法访问settings属性
报错原因
- Dart 空安全机制限制:
ModalRoute.of(context)返回值为ModalRoute<Object?>?可空类型,在不确定值非空的情况下不能直接访问其settings属性,否则会触发空访问报错。 - 类型不匹配:路由参数
arguments的默认类型为Object?,不能直接赋值给指定为Map<String, dynamic>类型的变量,需要显式做类型转换。 - 潜在遗漏配置:你当前的路由生成器中创建
MaterialPageRoute时没有传递settings参数,会导致路由参数无法正常传递到目标页面。
修复步骤
- 修正路由生成器参数传递逻辑
打开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!'), ), ); }); } }
- 修正首页参数获取逻辑
打开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
相关产品推荐
相关产品推荐

