使用 Flutter BLOC 监听事件而不是状态
Listen to Events instead of States with Flutter BLOC
我正在使用 Flutter BLOC 库 (https://pub.dev/packages/bloc)
我知道有一种方法可以 "listen to" BLOC 状态变化(使用 listen() 函数)
chatBloc.listen((chatState) async {
if (chatState is ChatStateInitialized) {
// do something
}
});
但是有没有办法改为监听 BLOC 事件?就像我对经典 StreamController 所做的那样?
感谢所有愿意提供帮助的人:-)
朱利安
是的,您可以通过以下代码监听 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_delegate.dart,用于收听 BLoC 的事件:
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);
}
}
已更新版本 7/8
倾听集团的变化
如果您只需要监听一个 Bloc 更改,您可以在所需的 Bloc class.
内覆盖 void onChange(Change<State> change)
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 变化
如果您需要在多个 Bloc 上全局监听更改,您可以使用 BlocObserver
class.
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 library documentation 的更多信息。
我正在使用 Flutter BLOC 库 (https://pub.dev/packages/bloc) 我知道有一种方法可以 "listen to" BLOC 状态变化(使用 listen() 函数)
chatBloc.listen((chatState) async {
if (chatState is ChatStateInitialized) {
// do something
}
});
但是有没有办法改为监听 BLOC 事件?就像我对经典 StreamController 所做的那样? 感谢所有愿意提供帮助的人:-)
朱利安
是的,您可以通过以下代码监听 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_delegate.dart,用于收听 BLoC 的事件:
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);
}
}
已更新版本 7/8
倾听集团的变化
如果您只需要监听一个 Bloc 更改,您可以在所需的 Bloc class.
内覆盖void onChange(Change<State> change)
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 变化
如果您需要在多个 Bloc 上全局监听更改,您可以使用 BlocObserver
class.
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 library documentation 的更多信息。