flutter_bloc パッケージを使用して、この単純なブロックを実装しました。
class MainBloc extends Bloc<MainEvent, MainState> {
@override
MainState get initialState => Init();
@override
Stream<MainState> mapEventToState(MainEvent event) async* {
if (event is Event) {
yield* _mapEventToState();
}
}
Stream<MainState> _mapEventToState() async* {
final loadState = Load();
print("Yield state: $loadState");
yield loadState;
await sleep(Duration(seconds: 1));
final initState = Init();
print("Yield state: $initState");
yield initState;
}
}
このイベントで:
abstract class MainEvent {}
class Event extends MainEvent {}
そしてこの状態:
abstract class MainState {}
class Load extends MainState {}
class Init extends MainState {}
私のUIは次のようになります。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Material App',
home: BlocProvider(
create: (context) => MainBloc(),
child: Scaffold(
appBar: AppBar(),
body: BlocBuilder<MainBloc, MainState>(
builder: (context, state) {
print("Build state: $state");
if (state is Init) {
return MaterialButton(
onPressed: () => BlocProvider.of<MainBloc>(context).add(Event()),
child: Text("Press"),
);
} else {
return Text("Loading");
}
},
),
),
),
);
}
}
残念ながら、MaterialButton を使用して Event を追加すると、Load() 状態は無視されます。UI は Load 状態を再構築しません。出力は次のとおりです。
I/flutter (1955): 降伏状態: 「負荷」のインスタンス
I/flutter (1955): 降伏状態: 「Init」のインスタンス
I/flutter (1955): ビルド状態: 「Init」のインスタンス