flutter Riverpod将参数从状态通告程序类移动到类内的函数中

7eumitmz  于 2023-01-31  发布在  Flutter
关注(0)|答案(1)|浏览(124)

我是flutter的新手,也是riverpod的新手。我刚刚得到一些代码的帮助,使用倒计时时钟,然后可以使用riverpod在多个页面上查看。这里是riverpod状态通知程序。

final countDownControllerProvider = StateNotifierProvider.family
    .autoDispose<CountdownController, Duration, Duration>(
        (ref, initialDuration) {
  return CountdownController(initialDuration);
});

class CountdownController extends StateNotifier<Duration> {
  Timer? timer;
  final Duration initialDuration;

  CountdownController(this.initialDuration) : super(initialDuration) {
    stopTimer();
  }

  void startTimer() {
    timer = Timer.periodic(const Duration(seconds: 1), (timer) {
      if (state == Duration.zero) {
        timer.cancel();
      } else {
        if (mounted) {
          state = state - const Duration(seconds: 1);
        } else {
          timer.cancel();
        }
      }
    });
  }
}

目前,倒计时时钟上显示的时间输入是在调用CountdownController时输入的。(类中包含startTimer函数)。我遇到的问题是,如果我想调用startTimer(),我需要重新输入要显示的时间,如果我停止并启动时钟,这是一个问题。
如何将时间输入从CountdownController类的一个参数移动到类中的一个函数中,然后在需要时调用该函数,这样在启动/停止时钟时就不必设置它了?该代码是什么样子的?
非常感谢

0x6upsns

0x6upsns1#

我没有测试它。如果你需要保存状态的持续时间,考虑把状态做成一个数据类。

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'dart:async';

final countDownControllerProvider = StateNotifierProvider
    .autoDispose<CountdownController, Duration>((ref) {
  return CountdownController();
});

class CountdownController extends StateNotifier<Timer?> {
  CountdownController(): super(null);

  void startTimer(Duration duration) {
    state?.cancel();
    state = Timer.periodic(duration, (timer) {
      // Whatever you want
    });
  }
  
  void stopTimer() {
    state?.cancel();
  }
}

相关问题