0

使用状态更改观察器,我可以看到我的集团将其状态更改LoadInProgressPmLoadSuccess. 但是,更改为 时不会调用小部件LoadInProgress。我在 中有一个断点,但是,代码仅在发出BlocBuilder时才会停在那里。PmLoadSuccess

我的状态定义

@freezed
class ProblemManagerState with _$ProblemManagerState {
  const factory ProblemManagerState.initial() = PmInitial;
  const factory ProblemManagerState.loadInProgress() = PmLoadInProgress;
  const factory ProblemManagerState.loadSuccess(
      Problem problem) = PmLoadSuccess;
      ) = PmSyncFailed;
}

集团

@injectable
class ProblemManagerBloc extends Bloc<ProblemManagerEvent, ProblemManagerState> {
  final IProblemsRepository problemsRepository;
  ProblemManagerBloc(this.problemsRepository) : super(PmInitial());

  @override
  Stream<ProblemManagerState> mapEventToState(
    ProblemManagerEvent event,
  ) async* {
    yield PmLoadInProgress();  // <<< does not emit to widget 
    yield* event.map(
      pmProblemRequested: (e) async* {
        yield ProblemManagerState.loadInProgress();  // <<< doesn't emit either 
        print (state);
        yield* _mapPmProblemRequestedToState(e);
      },
    );
  }

  Stream<ProblemManagerState> _mapPmProblemRequestedToState(/*PmProblemRequested*/dynamic event) async* {
    dynamic nextProblem;
    late int problemClassId;
    problemClassId = event.problemClassId!;
    }
    final String rootId = await _getNextProblemRootId(problemClassId);
    final Either<StorageFailure, Problem> failureOrProblem = await problemsRepository.getProblem(rootId);
    yield failureOrProblem.fold(
            (fail) => PmLoadFailure(fail),
            (load) => PmLoadSuccess(load)); // <<< yield does emit to  widget
  }

小部件(如果加载成功则调用另一个小部件)

class ProblemManagerPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<ProblemManagerBloc, ProblemManagerState>(
        builder: (context, state) {
          return state.map(  // <<< breakpoint not reached with PmLoadInProgress (=ProblemManagerState.loadInProgress)
              initial: (_) => Container(),
              loadInProgress: (_) => const Center(
                  child: CircularProgressIndicator(),
              ),
              loadSuccess: (state) => PmGateway(state.problem),
          );
        }
    );
  }
}
4

1 回答 1

0

取自github 问题列表

这是意料之中的,因为 BlocBuilder 只能以 60fps 的速度重建。在这种情况下,您发出状态的速度比 BlocBuilder 重建的速度要快。

于 2021-08-23T16:45:04.643 回答