m3_lightmeter/lib/screens/timer/bloc_timer.dart

78 lines
1.9 KiB
Dart
Raw Normal View History

2024-04-30 14:32:01 +00:00
import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:lightmeter/interactors/metering_interactor.dart';
2024-04-30 19:50:09 +00:00
import 'package:lightmeter/screens/timer/event_timer.dart';
import 'package:lightmeter/screens/timer/state_timer.dart';
2024-04-30 14:32:01 +00:00
2024-04-30 19:50:09 +00:00
class TimerBloc extends Bloc<TimerEvent, TimerState> {
2024-04-30 14:32:01 +00:00
final MeteringInteractor _meteringInteractor;
2024-04-30 19:50:09 +00:00
late Timer? _timer;
final int timerLength;
TimerBloc(this._meteringInteractor, this.timerLength)
: super(
TimerStoppedState(
duration: Duration(seconds: timerLength),
timeLeft: Duration(seconds: timerLength),
2024-04-30 14:32:01 +00:00
),
) {
2024-04-30 19:50:09 +00:00
on<StartTimerEvent>(_onStartTimer);
on<SetTimeLeftEvent>(_onSetTimeLeft);
on<StopTimerEvent>(_onStopTimer);
on<ResetTimerEvent>(_onResetTimer);
2024-04-30 14:32:01 +00:00
}
@override
Future<void> close() async {
2024-04-30 19:50:09 +00:00
_timer?.cancel();
2024-04-30 14:32:01 +00:00
return super.close();
}
2024-04-30 19:50:09 +00:00
Future<void> _onStartTimer(StartTimerEvent _, Emitter emit) async {
2024-04-30 14:32:01 +00:00
emit(
2024-04-30 19:50:09 +00:00
TimerResumedState(
duration: state.duration,
timeLeft: state.timeLeft,
2024-04-30 14:32:01 +00:00
),
);
2024-04-30 19:50:09 +00:00
_timer = Timer.periodic(const Duration(seconds: 1), (_) {
if (state.timeLeft.inMilliseconds == 0) {
add(const StopTimerEvent());
2024-04-30 20:01:19 +00:00
} else {
add(SetTimeLeftEvent(state.timeLeft - const Duration(seconds: 1)));
2024-04-30 19:50:09 +00:00
}
});
2024-04-30 14:32:01 +00:00
}
2024-04-30 19:50:09 +00:00
Future<void> _onSetTimeLeft(SetTimeLeftEvent event, Emitter emit) async {
2024-04-30 14:32:01 +00:00
emit(
2024-04-30 19:50:09 +00:00
TimerResumedState(
duration: state.duration,
timeLeft: event.timeLeft,
2024-04-30 14:32:01 +00:00
),
);
}
2024-04-30 19:50:09 +00:00
Future<void> _onStopTimer(StopTimerEvent _, Emitter emit) async {
_timer?.cancel();
2024-04-30 14:32:01 +00:00
emit(
2024-04-30 19:50:09 +00:00
TimerStoppedState(
duration: state.duration,
timeLeft: state.timeLeft,
2024-04-30 14:32:01 +00:00
),
);
}
2024-04-30 19:50:09 +00:00
Future<void> _onResetTimer(ResetTimerEvent _, Emitter emit) async {
_timer?.cancel();
emit(
TimerStoppedState(
duration: state.duration,
timeLeft: state.duration,
),
);
2024-04-30 14:32:01 +00:00
}
}