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

Flutter路由传参问题:如何从list_screen向tenancyDetailsScreen传参

解决方案

核心问题在于你当前的Routes类持有一个预实例化的TenancyDetailsScreen对象,无法在导航时动态传递参数。我们需要调整路由配置,让它支持接收参数并传递给目标页面。

1. 修改Routes类

更新routes.dart,将静态page改为可接收参数的builder函数:

class Routes extends Equatable {
  final String route;
  final Widget Function(BuildContext, dynamic?) builder;

  const Routes(this.route, this.builder);

  @override
  List<Object> get props => [route];

  MaterialPageRoute materialRoute(RouteSettings settings) {
    return MaterialPageRoute(
      builder: (context) => SafeArea(
        child: builder(context, settings.arguments),
      ),
      settings: settings,
    );
  }
}

2. 调整AppRoute配置

在app_route.dart中,通过builder函数将参数传递给TenancyDetailsScreen:

class AppRoute {
  static const tenancyDetailsScreen = '/tenancyDetailsScreen';

  static final _tenancyDetailsScreenRoute = Routes(
    tenancyDetailsScreen,
    (context, args) => TenancyDetailsScreen(tenancy: args as Tenancy),
  );

  static Route? onGenerateRoutes(RouteSettings settings) {
    if (settings.name == tenancyDetailsScreen) {
      return _tenancyDetailsScreenRoute.materialRoute(settings);
    }
    // ...其他路由逻辑
  }
}

3. 确保目标页面接收参数

修改TenancyDetailsScreen,添加接收Tenancy对象的构造函数:

class TenancyDetailsScreen extends StatelessWidget {
  final Tenancy tenancy;

  const TenancyDetailsScreen({super.key, required this.tenancy});

  @override
  Widget build(BuildContext context) {
    // 使用this.tenancy渲染页面内容
    return Scaffold(
      appBar: AppBar(title: Text(tenancy.name)),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Text(tenancy.details),
      ),
    );
  }
}

原理说明

这种方式将页面的实例化延迟到导航发生时,通过builder函数动态注入参数,解决了原方案中预实例化页面无法接收动态数据的问题。你的list_screen.dart中的导航代码无需修改,参数会通过RouteSettings自动传递到目标页面。

内容的提问来源于stack exchange,提问作者AI.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:45:24