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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:36:05