Skip to content

Instantly share code, notes, and snippets.

@felangel
Created May 28, 2019 02:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save felangel/1170e9202f50375fadcd429d751bd8ca to your computer and use it in GitHub Desktop.
Save felangel/1170e9202f50375fadcd429d751bd8ca to your computer and use it in GitHub Desktop.
[flutter_timer] Timer Bloc tick event
import 'dart:async';
import 'package:meta/meta.dart';
import 'package:bloc/bloc.dart';
import 'package:flutter_timer/bloc/bloc.dart';
import 'package:flutter_timer/ticker.dart';
class TimerBloc extends Bloc<TimerEvent, TimerState> {
final Ticker _ticker;
final int _duration = 60;
StreamSubscription<int> _tickerSubscription;
TimerBloc({@required Ticker ticker})
: assert(ticker != null),
_ticker = ticker;
@override
TimerState get initialState => Ready(_duration);
@override
Stream<TimerState> mapEventToState(
TimerEvent event,
) async* {
if (event is Start) {
yield* _mapStartToState(event);
} else if (event is Tick) {
yield* _mapTickToState(event);
}
}
@override
void dispose() {
_tickerSubscription?.cancel();
super.dispose();
}
Stream<TimerState> _mapStartToState(Start start) async* {
yield Running(start.duration);
_tickerSubscription?.cancel();
_tickerSubscription = _ticker.tick(ticks: start.duration).listen(
(duration) {
dispatch(Tick(duration: duration));
},
);
}
Stream<TimerState> _mapTickToState(Tick tick) async* {
yield tick.duration > 0 ? Running(tick.duration) : Finished();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment