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.
相关产品推荐
相关产品推荐

