dart 在flutter_bloc的计时器示例中添加自定义持续时间

w7t8yxp5  于 2024-01-04  发布在  Flutter
关注(0)|答案(1)|浏览(183)

我正在学习flutter_bloc,并在https://bloclibrary.dev/#/fluttertimertutorial?id=flutter-timer-tutorial上做了计时器示例
然而,计时器总是重置为60秒,所以我想能够设置一个自定义的初始持续时间。
我的方法:

  • 将字段initialDuration添加到TimerState和所有子类构造函数
  • TimerNewDuration事件添加到timer_event.dart
  • 更新timer_bloc.dart以在每个状态处理程序中使用以下emit行处理此问题:
  1. constructor: super(TimerInitial(_defaultDuration)) # i.e. 60 seconds
  2. _onNewDuration: emit(TimerInitial(event.duration))
  3. _onStarted: emit(TimerRunInProgress(event.duration, state.initialDuration))
  4. _onReset: emit(TimerInitial(state.initialDuration))
  5. _onPaused: emit(TimerRunPause(state.duration, state.initialDuration))
  6. _onTicked: emit(event.duration > 0
  7. ? TimerRunInProgress(event.duration, state.initialDuration)
  8. : TimerRunComplete(state.initialDuration));

字符串
.等等。然而,这有点麻烦:计时器状态和初始持续时间并不真正相关(除了更新初始持续时间应该重置计时器),所以我必须通过BLoC中的每个事件处理程序传递这个值。
如果添加更多的状态值,这显然会变得非常混乱。
有没有更习惯的方法来处理这种情况?任何github的例子将不胜感激。

jv2fixgn

jv2fixgn1#

你可以在copyWith(...)方法中使用一个状态:

  1. import 'package:equatable/equatable.dart';
  2. class TimerState extends Equatable {
  3. const TimerState({
  4. this.isPause = false,
  5. this.isInProgress = false,
  6. this.isComplete = false,
  7. this.duration = 0,
  8. });
  9. final bool isPause;
  10. final bool isInProgress;
  11. final bool isComplete;
  12. final int duration;
  13. @override
  14. List<Object?> get props => [isPause, isInProgress, isComplete, duration];
  15. TimerState copyWith({
  16. bool? isPause,
  17. bool? isInProgress,
  18. bool? isComplete,
  19. int? duration,
  20. }) {
  21. return TimerState(
  22. isPause: isPause ?? this.isPause,
  23. isInProgress: isInProgress ?? this.isInProgress,
  24. isComplete: isComplete ?? this.isComplete,
  25. duration: duration ?? this.duration,
  26. );
  27. }
  28. }

字符串
那么你的代码应该是这样的:

  1. constructor: super(TimerState(duration: _defaultDuration)) # i.e. 60 seconds
  2. _onNewDuration: emit(state.copyWith(duration: event.duration))
  3. _onStarted: emit(state.copyWith(isInProgress: true, isPaused: false))
  4. _onReset: emit(TimerState(duration: _defaultDuration))
  5. _onPaused: emit(state.copyWith(isPaused: true, isInProgress: false))
  6. _onTicked: emit(state.copyWith(isCompleted: event.duration > 0);


p.s. TimerState可以被密封,对于状态complete可以使用状态:

  1. final class TimerRunComplete extends TimerState {
  2. const TimerRunComplete();
  3. }

展开查看全部

相关问题