Flutter导航传参问题:ModalRoute获取arguments返回null
Flutter导航传参返回null的解决方法
1. 修正拼写错误
你的DetailScreen代码里存在拼写错误:settings.arguements应该是settings.arguments(少了一个m),这是导致获取到null的直接原因之一。修正后的代码:
class DetailScreen extends StatelessWidget { @override Widget build(BuildContext context) { final arguments = ModalRoute.of(context)!.settings.arguments; print(arguments); // 现在应该能获取到预期值 return Scaffold( body: Container(), ); } }
2. 检查路由生成逻辑(AppRoutes.generateRoute)
因为你使用了onGenerateRoute管理路由,必须确保生成/detailScreenRoute时,将路由的settings.arguments传递给DetailScreen。如果generateRoute未处理参数传递,即使跳转时传了参数,页面也无法获取。示例正确实现如下:
class AppRoutes { static Route<dynamic> generateRoute(RouteSettings settings) { switch (settings.name) { case '/detailScreenRoute': // 传递包含arguments的settings给页面 return MaterialPageRoute( builder: (context) => DetailScreen(), settings: settings, // 关键:保留原settings,确保参数被传递 ); // 其他路由处理逻辑... default: return MaterialPageRoute(builder: (context) => MainScreen()); } } }
3. 确保上下文有效性
如果上述修正后仍有问题,检查ModalRoute.of(context)使用的上下文是否属于当前路由的上下文。若在父级widget上下文中调用,可能获取到上层路由信息,可通过Builder包裹确保使用当前页面上下文:
class DetailScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Builder( builder: (innerContext) { final arguments = ModalRoute.of(innerContext)!.settings.arguments; print(arguments); return Scaffold(body: Container()); }, ); } }
内容的提问来源于stack exchange,提问作者Beatle Refractor
相关产品推荐
相关产品推荐

