[Flutter/Riverpod] riverpod/stream으로 timer 구현하기

찌니·2023년 4월 17일
1
post-thumbnail

이전에 만든 프로젝트를 리팩토링중인데 provider에서 riverpod으로 상태관리를 변경하고 있다. 원래는 stopwatch로 프로바이더 내부에서 1초마다 noti를 하는 코드였는데 이 부분은 스트림으로 처리하는게 맞다는 생각이 들었다. 심지어 관리하던 프로바이더에서는 10개가 넘는 값을 관리하고 있었다.. 진짜 왜 그랫을까요? 그렇게 새로 만들기 시작한 코드
사실 쉬워서 금방 만들 수 있는 코드..지만 이방법 저방법 해보다가 시간 좀 걸림^^

먼저 TimerProvider

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을 받을 수 있다

profile
찌니's develog

0개의 댓글