当使用EventBus函数时,此代码无法在两个不同的类之间发送信息。
import 'package:flutter/material.dart';
import 'package:scoped_model/scoped_model.dart';
import 'package:event_bus/event_bus.dart';
import 'dart:async';
//EventBus usage
final EventBus eventBus = EventBus();
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
static final GlobalKey<NavigatorState> navigatorKey =
GlobalKey<NavigatorState>();
static var isLoggedIn = false;
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: navigatorKey,
onGenerateRoute: _generateRoute,
home: const HomeScreen(),
);
}
Route<dynamic>? _generateRoute(RouteSettings settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute( settings: settings, builder: (context) => const HomeScreen()); //settingsçä½ç¨æ¯debug, 追溯ç®ånavigator stackä¸è®¿é®è¿ç页é¢
case '/transactions':
return MaterialPageRoute(
settings: settings, builder: (context) => TransactionScreen());
case '/cart':
return MaterialPageRoute(
settings: settings, builder: (context) => CartScreen());
default:
return null;
}
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
Navigator.of(context).pushNamed('/transactions');
},
child: const Text('View transactions'),
),
ElevatedButton(
onPressed: () {
Navigator.of(context).pushNamed('/cart');
},
child: const Text('View Cart'),
),
],
),
),
);
}
}
class TransactionScreen extends StatelessWidget {
String message = 'Justin YC';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Transactions'),
),
body: Center(
child: Column(
children: [
ElevatedButton(
onPressed: () {
Navigator.of(context).pushNamed('/cart');
},
child: const Text('View Cart'),
),
ElevatedButton(
onPressed: () {
print("event has been sent: $message");
eventBus.fire(CustomEvent(message));
},
child: Text('Tap to send new Info: $message'),
),
],
),
),
);
}
}
class CustomEvent {
String msg;
CustomEvent(this.msg);
}
class CartScreen extends StatefulWidget {
const CartScreen({Key? key}) : super(key: key);
@override
State<CartScreen> createState() => _CartScreenState();
}
class _CartScreenState extends State<CartScreen> {
late StreamSubscription subscription;
String msg = " éç¥ï¼";
@override
void initState() {
subscription = eventBus.on<CustomEvent>().listen((event) {
print('received $event.msg');
setState(() {msg = event.msg;});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Cart'),
),
body: Center(
child: Text(msg),
),
);
}
@override
void dispose() {
super.dispose();
}
}
我尝试了几种不同的方法,包括在启动应用程序时保持两个小部件的活动状态。
我发现,如果我让它们都活着,听众就可以从发送者那里收到消息。然而,这将导致另一个问题,即小部件不再在小部件树上。因此接收器不能进一步处理数据。