2

我正在使用 Flutter BLOC 库(https://pub.dev/packages/bloc)我知道有一种方法可以“监听” BLOC 状态更改(使用 listen() 函数)

chatBloc.listen((chatState) async {
      if (chatState is ChatStateInitialized) {
        // do something
      }
    });

但是有没有办法收听 BLOC 事件呢?就像我对经典 StreamController 所做的那样?感谢所有愿意提供帮助的人:-)

朱利安

4

2 回答 2

2

是的,您可以通过以下代码收听 BLoC 事件:

BlocSupervisor.delegate = MyBlocDelegate();

你的main.dart类似于下面的代码:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  BlocSupervisor.delegate = MyBlocDelegate();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BlocProvider<CounterBLoC>(
        create: (ctx) => CounterBLoC(),
        child: TestBlocWidget(),
      ),
    );
  }
}

这是您用于收听 BLoC 事件的 bloc_delegate.dart

import 'package:bloc/bloc.dart';

class MyBlocDelegate extends BlocDelegate {
  @override
  void onEvent(Bloc bloc, Object event) {
    print(event);
    super.onEvent(bloc, event);
  }

  @override
  void onError(Bloc bloc, Object error, StackTrace stackTrace) {
    print(error);
    super.onError(bloc, error, stackTrace);
  }

  @override
  void onTransition(Bloc bloc, Transition transition) {
    print(transition);
    super.onTransition(bloc, transition);
  }
}
于 2020-06-25T09:48:12.847 回答
0

更新版本 7/8

倾听集团的变化

如果您只需要监听一个 Bloc 更改,则可以void onChange(Change<State> change)在所需的 Bloc 类中覆盖。

enum CounterEvent { increment }

class CounterBloc extends Bloc<CounterEvent, int> {
  CounterBloc() : super(0);

  @override
  Stream<int> mapEventToState(CounterEvent event) async* {
    switch (event) {
      case CounterEvent.increment:
        yield state + 1;
        break;
    }
  }

  @override
  void onChange(Change<int> change) {
    print(change);
    super.onChange(change);
  }
}

聆听多个集团变化

如果您需要在多个 Bloc 上全局监听更改,您可以使用BlocObserver该类。

class SimpleBlocObserver extends BlocObserver {
  @override
  void onChange(BlocBase bloc, Change change) {
    super.onChange(bloc, change);
    print('${bloc.runtimeType} $change');
  }

  @override
  void onTransition(Bloc bloc, Transition transition) {
    super.onTransition(bloc, transition);
    print('${bloc.runtimeType} $transition');
  }

  @override
  void onError(BlocBase bloc, Object error, StackTrace stackTrace) {
    print('${bloc.runtimeType} $error $stackTrace');
    super.onError(bloc, error, stackTrace);
  }
}

然后,您需要对其进行初始化。

void main() {
  Bloc.observer = SimpleBlocObserver();
  CounterBloc()
    ..add(CounterEvent.increment)
    ..close();
}

有关Flutter Bloc 库文档的更多信息。

于 2021-09-20T19:11:31.340 回答