0

flutter_bloc パッケージの BlocBuilder を使用して、状態の変化に対応しています。

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<BreathalyzerBloc, BreathalyzerState>(
      builder: (context, state) {

        if (state is BreathalyzerConnected) {
          return Center(child: Text('CONNECTED'));
        }

        if (state is BreathalyzerWarmingUp) {
          return Center(child: Text('PREPARE TO BLOW IN ${state.countDown}'));
        }

      },
    );

問題:複数の連続したイベントにより、連続した BreathalyzerWarmingUp 状態が生成されますが、連続するカウントダウン値は異なります (例: 3、2、1)。ただし、別の状態への実際の遷移はないため、BlocBuilder は後続の状態を無視し、UI はスタックして最初のカウントダウン値のみを表示します。

画面が次のように変化することを期待します。

PREPARE TO BLOW IN 3
PREPARE TO BLOW IN 2
PREPARE TO BLOW IN 1

取得中:

PREPARE TO BLOW IN 3

助言がありますか?

4

1 に答える 1

0

これを追跡して、Equatable を拡張する BreathalyzerWarmingUp の props 関数のオーバーライドが欠落していることを突き止めました。props のオーバーライドが欠落していたため、countDown が減少している場合でも、BlocBuilder は連続する BreathalyzerWarmingUp 状態を等しいものとして扱っていました。

不正なコード

class BreathalyzerWarmingUp extends BreathalyzerState {
  final String countDown;

  BreathalyzerWarmingUp({@required this.countDown}) : super();

  @override
  String toString() => 'BreathalyzerWarmingUp { countDown: $countDown }';
}

修正されたコード:

class BreathalyzerWarmingUp extends BreathalyzerState {
  final String countDown;

  BreathalyzerWarmingUp({@required this.countDown}) : super();

  @override
  List<Object> get props {
    return [countDown];
  }

  @override
  String toString() => 'BreathalyzerWarmingUp { countDown: $countDown }';
}
于 2020-03-31T06:27:21.440 に答える