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

w7t8yxp5  于 12个月前  发布在  Flutter
关注(0)|答案(1)|浏览(145)

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

  • 将字段initialDuration添加到TimerState和所有子类构造函数
  • TimerNewDuration事件添加到timer_event.dart
  • 更新timer_bloc.dart以在每个状态处理程序中使用以下emit行处理此问题:
constructor: super(TimerInitial(_defaultDuration)) # i.e. 60 seconds

_onNewDuration: emit(TimerInitial(event.duration))

_onStarted: emit(TimerRunInProgress(event.duration, state.initialDuration))

_onReset: emit(TimerInitial(state.initialDuration))

_onPaused: emit(TimerRunPause(state.duration, state.initialDuration))

_onTicked:     emit(event.duration > 0
        ? TimerRunInProgress(event.duration, state.initialDuration)
        : TimerRunComplete(state.initialDuration));

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

jv2fixgn

jv2fixgn1#

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

import 'package:equatable/equatable.dart';

class TimerState extends Equatable {
  const TimerState({
    this.isPause = false,
    this.isInProgress = false,
    this.isComplete = false,
    this.duration = 0,
  });

  final bool isPause;
  final bool isInProgress;
  final bool isComplete;
  final int duration;

  @override
  List<Object?> get props => [isPause, isInProgress, isComplete, duration];

  TimerState copyWith({
    bool? isPause,
    bool? isInProgress,
    bool? isComplete,
    int? duration,
  }) {
    return TimerState(
      isPause: isPause ?? this.isPause,
      isInProgress: isInProgress ?? this.isInProgress,
      isComplete: isComplete ?? this.isComplete,
      duration: duration ?? this.duration,
    );
  }
}

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

constructor: super(TimerState(duration: _defaultDuration)) # i.e. 60 seconds

_onNewDuration: emit(state.copyWith(duration: event.duration))

_onStarted: emit(state.copyWith(isInProgress: true, isPaused: false))

_onReset: emit(TimerState(duration: _defaultDuration))

_onPaused: emit(state.copyWith(isPaused: true, isInProgress: false))

_onTicked: emit(state.copyWith(isCompleted: event.duration > 0);


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

final class TimerRunComplete extends TimerState {
  const TimerRunComplete();
}

相关问题