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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:55:20