代码之家  ›  专栏  ›  技术社区  ›  Justin Chen

flutter事件总线问题,无法将消息从发送方发送到接收方

  •  0
  • Justin Chen  · 技术社区  · 1 年前

    当使用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();
      }
    }
    
    
    

    我尝试了几种不同的方法,包括在启动应用程序时保持两个小部件的活动状态。

    我发现,如果我让它们都活着,听众就可以从发送者那里收到消息。然而,这将导致另一个问题,即小部件不再在小部件树上。因此接收器不能进一步处理数据。

    0 回复  |  直到 1 年前