0

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」のインスタンス

4

1 に答える 1