Flutter中如何通过路由将选中event数据从无状态widget传递到有状态widget
解决方案
你需要依次修改3处代码,完成Event对象从路由参数到结账页的传递:
1. 修改BookTicketScreen类,增加Event参数接收逻辑
原来的BookTicketScreen没有定义接收Event对象的属性,也没有在静态路由方法中处理入参,修改后代码如下:
import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; // 注意要导入Event类所在的文件 import 'event.dart'; class BookTicketScreen extends StatefulWidget { static const String routeName = '/bookTicket'; // 新增接收Event参数的路由方法 static Route route({required Event event}) { return MaterialPageRoute( settings: RouteSettings(name: routeName), builder: (_) => BookTicketScreen(event: event)); } // 新增event属性 final Event event; const BookTicketScreen({required this.event, super.key}); @override _BookTicketScreenState createState() => _BookTicketScreenState(); } class _BookTicketScreenState extends State<BookTicketScreen> { // 直接通过widget.event获取传递过来的活动数据,替换原来硬编码的Event.events[6] late final String _ticketType = '€${widget.event.price}'; @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ Text(_ticketType), ], ), ); } }
2. 修改路由配置AppRouter的onGenerateRoute方法
原来的结账页路由没有把路由参数传递给路由方法,修改对应分支:
class AppRouter { static Route onGenerateRoute(RouteSettings settings) { print('This is route ${settings.name}'); switch (settings.name) { case '/': return HomeScreen.route(); case HomeScreen.routeName: return HomeScreen.route(); case EventScreen.routeName: return EventScreen.route(event: settings.arguments as Event); case BookTicketScreen.routeName: // 新增参数传递逻辑,把settings.arguments转为Event传给route方法 return BookTicketScreen.route(event: settings.arguments as Event); // 其他路由逻辑 default: return HomeScreen.route(); } } }
其他注意事项
- 你原来的代码里
Var要改为小写的var,Dart语法严格区分大小写 - 你Event类定义里没有
ticketType4Price属性,你可以根据需求直接用已经定义的price字段,或者给Event类补充你需要的票价字段即可 - 你现在EventScreen里点击
Book Now按钮调用Navigator.pushNamed已经把event作为参数传入,不需要修改这部分逻辑
内容的提问来源于stack exchange,提问作者Dimitris Konstantinou
相关产品推荐
相关产品推荐

