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

Flutter路由跳转时如何向StatefulWidget传递对象?

在Flutter路由配置中向StatefulWidget传递对象的方案

嘿,针对你现在的路由配置场景,我给你两种实用的解决方案,都是Flutter开发中常用的:

方案一:利用路由参数arguments(推荐,适配现有路由表)

这是Flutter官方推荐的方式,完全兼容你当前在MaterialApp里配置的routes表。

步骤1:跳转时传递对象

在HomeWidget里触发跳转的地方,使用Navigator.pushNamed并通过arguments参数传入你的对象:

// 假设你要传递的是一个自定义的Movie对象
Navigator.pushNamed(
  context,
  "/ItemDetailWidget",
  arguments: Movie(id: 1, title: "Test Movie"), // 替换成你的实际对象实例
);

步骤2:在目标页面获取对象

在MovieDetailsPage(你的StatefulWidget)中,通过ModalRoute获取传递的参数:

class MovieDetailsPage extends StatefulWidget {
  const MovieDetailsPage({Key? key}) : super(key: key);

  @override
  _MovieDetailsPageState createState() => _MovieDetailsPageState();
}

class _MovieDetailsPageState extends State<MovieDetailsPage> {
  late Movie _movie;

  @override
  void initState() {
    super.initState();
    // 延迟获取参数,确保context已完成初始化
    WidgetsBinding.instance.addPostFrameCallback((_) {
      final args = ModalRoute.of(context)?.settings.arguments;
      if (args is Movie) {
        setState(() {
          _movie = args;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(_movie.title)),
      body: Center(child: Text("Movie ID: ${_movie.id}")),
    );
  }
}

注意:如果直接在initState里调用ModalRoute.of(context)可能会返回null,所以用addPostFrameCallback确保页面渲染完成后再获取参数更安全。当然你也可以直接在build方法里获取,不过记得处理空值情况。

方案二:通过构造函数传参(跳过路由表)

如果你不需要使用已配置的路由表,也可以直接通过页面的构造函数传递对象,这种方式更直观:

步骤1:修改目标页面的构造函数

给MovieDetailsPage添加接收对象的构造参数:

class MovieDetailsPage extends StatefulWidget {
  final Movie movie; // 声明接收的对象参数

  const MovieDetailsPage(this.movie, {Key? key}) : super(key: key);

  @override
  _MovieDetailsPageState createState() => _MovieDetailsPageState();
}

步骤2:直接跳转并传参

在HomeWidget里使用Navigator.push直接实例化页面并传参:

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => MovieDetailsPage(Movie(id: 1, title: "Test Movie")),
  ),
);

步骤3:在State中访问对象

在_MovieDetailsPageState里可以直接通过widget.movie访问传递过来的对象:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text(widget.movie.title)),
    body: Center(child: Text("Movie ID: ${widget.movie.id}")),
  );
}

额外注意事项

  • 如果你的自定义对象需要持久化或者通过深层链接传递,建议让它支持序列化(比如使用json_serializable包),不过仅内存传递的话不需要。
  • 空安全环境下,记得对参数做非空判断,避免类型转换异常,比如使用args is Movie来做类型检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:08:24