I have a screen that is a stateful widget and contains events. When you click on one it takes you to another screen to view more info about it, once again a stateless widget and everything works fine. When i click a button though there i want it to use the info from that specific event e.g. category and price and pass this data to a stateful widget in a 3rd screen for checkout.
How can i pass this data from a stateless widget to a stateful widget? Note: i am using routes also for my navigation menu.
TLDR: this Event.events[6].ticketType1 should be changed to event.ticketType1 where event is the event i clicked in the previous screen
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class BookTicketScreen extends StatefulWidget {
static const String routeName = '/bookTicket';
static Route route() {
return MaterialPageRoute(
settings: RouteSettings(name: routeName),
builder: (_) => BookTicketScreen());
}
@override
_BookTicketScreenState createState() => _BookTicketScreenState();
}
class _BookTicketScreenState extends State<BookTicketScreen> {
Var TicketType: '€' +'${Event.events[6].ticketType4Price}',
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Text('$_ticketType'),
],
),
);
}
}
Button from previous screen that navigates to statefulwidget screen and passes current event
class EventScreen extends StatelessWidget {
static const String routeName = '/viewEvent';
static Route route({required Event event}) {
return MaterialPageRoute(
settings: RouteSettings(name: routeName),
builder: (_) => EventScreen(event: event));
}
final Event event;
const EventScreen({required this.event});
@override
Widget build(BuildContext context) {
return Scaffold(
child:
TextButton(
child: Text('Book Now'),
onPressed: () {
Navigator.pushNamed(context, '/bookTicket', arguments: event);
},
),
),),
class AppRouter {
static Route onGenerateRoute(RouteSettings settings) {
print('This is route ${settings.name}');
switch (settings.name) {
case '/':
return HomeScreen.route();
case HomeScreen.routeName:
case EventScreen.routeName:
return EventScreen.route(event: settings.arguments as Event);
case BookTicketScreen.routeName:
return BookTicketScreen.route();
import 'package:equatable/equatable.dart';
class Event extends Equatable {
final String name;
final String category;
final String imageUrl;
final double price;
const Event({
required this.name,
required this.category,
required this.imageUrl,
required this.price,
});
@override
List<Object?> get props => [
name,
category,
imageUrl,
price,
];
static List<Event> events = [
Event(
category: 'Live Music',
name: 'Live event',
imageUrl:
'https://d1e00ek4ebabms.cloudfront.net/production/fd60d020-b4fa-47a3-9ef8-0af6265f7df3.jpg',
price: 29.99,
),