이전에 만든 프로젝트를 리팩토링중인데 provider에서 riverpod으로 상태관리를 변경하고 있다. 원래는 stopwatch로 프로바이더 내부에서 1초마다 noti를 하는 코드였는데 이 부분은 스트림으로 처리하는게 맞다는 생각이 들었다. 심지어 관리하던 프로바이더에서는 10개가 넘는 값을 관리하고 있었다.. 진짜 왜 그랫을까요? 그렇게 새로 만들기 시작한 코드
사실 쉬워서 금방 만들 수 있는 코드..지만 이방법 저방법 해보다가 시간 좀 걸림^^
먼저 TimerProvider
class TimerNotifier extends StateNotifier<int> {
TimerNotifier() : super(0);
late StreamSubscription<int> _stream;
set state(int value) {
super.state = value;
}
void start() {
_stream = Stream.periodic(Duration(seconds: 1), (x) => x).listen((x) {
if (mounted) {
state = x;
}
});
}
void pause() {
_stream.pause();
}
void restart() {
_stream.resume();
}
void cancel() {
_stream.cancel();
state = 0;
}
start()를 실행하면 타이머가 실행되며 timerstream을 생성하게 되며, pause()는 말그대로 일시정지, restart는 이어서 실행, cancel은 취소 및 초기화다
그 후 그냥 버튼 클릭 시
ref.read(timerProvider.notifier).start();
ref.read(timerProvider.notifier).pause();
... 하면 된다
물론
final time = ref.watch(timerProvider);
를 통해 time을 받을 수 있다