Flutter中如何在restorablePush中传递参数?
解决restorablePush路由参数传递问题
你遇到的核心问题是没找对restorablePush传递参数的位置,以及没在静态路由构建器里把参数传递给目标路由的设置项。按以下步骤修改即可:
步骤1:调用restorablePush时传入参数
Navigator.restorablePush的第三个可选参数就是用来传递序列化参数的,直接把你要传的Map放在这里:
Navigator.restorablePush( context, _myRouteBuilder, arguments: {'appBarTitle': title}, // 这里传入参数 );
步骤2:在静态路由构建器中传递参数到路由设置
静态的_myRouteBuilder会接收到这个arguments参数,你需要把它赋值给MaterialPageRoute的settings.arguments,这样目标页面才能通过ModalRoute获取:
static Route<void> _myRouteBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute<void>( settings: RouteSettings(arguments: arguments), // 新增这行传递参数 builder: (BuildContext context) => const Screen2(), ); }
(可选)优化Screen2的参数接收方式
你原来通过ModalRoute获取参数的方式没问题,但可以改成在Screen2的构造函数里接收参数,代码更清晰且类型安全:
class Screen2 extends StatefulWidget { final String appBarTitle; const Screen2({Key? key, required this.appBarTitle}) : super(key: key); @override State<Screen2> createState() => _Screen2State(); } class _Screen2State extends State<Screen2> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(widget.appBarTitle)), ); } }
对应的路由构建器也要改成:
static Route<void> _myRouteBuilder(BuildContext context, Object? arguments) { final args = arguments as Map<String, String>; return MaterialPageRoute<void>( builder: (BuildContext context) => Screen2(appBarTitle: args['appBarTitle'] ?? 'default'), ); }
修改后的完整代码
class Screen1 extends StatefulWidget { const Screen1({Key? key}) : super(key: key); @override State<Screen1> createState() => _Screen1State(); } class _Screen1State extends State<Screen1> { String title = 'blah'; static Route<void> _myRouteBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute<void>( settings: RouteSettings(arguments: arguments), // 传递参数到路由设置 builder: (BuildContext context) => const Screen2(), ); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: TextButton( onPressed: () { // 传入arguments参数 Navigator.restorablePush( context, _myRouteBuilder, arguments: {'appBarTitle': title}, ); }, child: const Text('Go to Screen 2')), ), ); } } class Screen2 extends StatefulWidget { const Screen2({Key? key}) : super(key: key); @override State<Screen2> createState() => _Screen2State(); } class _Screen2State extends State<Screen2> { String _string = ''; @override Widget build(BuildContext context) { final args = ModalRoute.of(context)!.settings.arguments as Map<String, String>; _string = args['appBarTitle'] ?? 'error'; return Scaffold( appBar: AppBar(title: Text(_string)), ); } }
内容的提问来源于stack exchange,提问作者Sparkringo
相关产品推荐
相关产品推荐

