【问题标题】:Is there a way I could refactor these similar functions in dart?有没有办法可以在飞镖中重构这些类似的功能?
【发布时间】:2022-01-20 22:13:48
【问题描述】:

我正在尝试使用 Flutter 中的提供者状态管理来设置变量的状态,所以当我在构建中调用提供者时,它将改变我的提供者类中布尔值的状态。

现在的问题是提供程序中的大多数函数都在做基本相同的事情,因为它们只是将布尔值更改为相反的值。

我一直在寻找一种方法来缩短代码,因为这些函数的作用基本相同。我一直在思考整个事情,但我什么也想不出来,而且这种意大利面条式的代码让我的眼睛很痛:

class AlarmState extends ChangeNotifier {
  var hour = 0;
  var min = 0;
  bool isWednesday = false;
  bool isMonday = false;
  bool isTuesday = false;
  bool isThursday = false;
  bool isFriday = false;
  bool isSaturday = false;
  bool isSunday = false;
  bool alarmRing = false;
  bool vibrate = false;
  bool snooze = false;
  List<AlarmObject> alarmList = [];
  bool isAlarmOn = true;

  void handleChangeHour(int index) {
    hour = index;
    notifyListeners();
  }

  void handleChangeMin(int index) {
    min = index;
    notifyListeners();
  }

  void changeMonday() {
    isMonday = !isMonday;
    notifyListeners();
  }

  void changeTuesday() {
    isTuesday = !isTuesday;
    notifyListeners();
  }

  void changeWednesday() {
    isWednesday = !isWednesday;
    notifyListeners();
  }

  void changeThursday() {
    isThursday = !isThursday;
    notifyListeners();
  }

  void changeFriday() {
    isFriday = !isFriday;
    notifyListeners();
  }

  void changeSaturday() {
    isSaturday = !isSaturday;
    notifyListeners();
  }

  void changeSunday() {
    isSunday = !isSunday;
    notifyListeners();
  }

  void handleAlarmRing(value) {
    alarmRing = value;
    notifyListeners();
  }

  void handleSnooze(value) {
    snooze = value;
    notifyListeners();
  }

  void handleVibrate(value) {
    vibrate = value;
    notifyListeners();
  }

  void handleIsAlarmOn(bool value) {
    isAlarmOn = value;
    print(isAlarmOn);
    notifyListeners();
  }
}

【问题讨论】:

  • 您可以使用List&lt;bool&gt; 和单个函数,而不是为一周中的每一天使用单独的变量和函数吗?
  • 我不知道我将如何实现它,你能告诉我吗?

标签: flutter dart flutter-provider


【解决方案1】:

我建议使用枚举 Weekday 来表示日期,并使用 Set&lt;Weekday&gt; 来跟踪活跃的日期。然后,使用带有可选命名参数的单个函数来更新AlarmState

最终结果可能如下所示:

enum Weekday {
  monday,
  tuesday,
  wednesday,
  thursday,
  friday,
  saturday,
  sunday,
}

class AlarmState extends ChangeNotifier {
  var hour = 0;
  var min = 0;
  Set<Weekday> activeDays = Set();
  bool alarmRing = false;
  bool vibrate = false;
  bool snooze = false;
  List<AlarmObject> alarmList = [];
  bool isAlarmOn = true;

  void update({
    int? hour,
    int? min,
    Set<Weekday>? activeDays,
    bool? alarmRing,
    bool? vibrate,
    bool? snooze,
    bool? isAlarmOn,
  }) {
    this.hour = hour ?? this.hour;
    this.min = min ?? this.min;
    this.activeDays = activeDays ?? this.activeDays;
    this.alarmRing = alarmRing ?? this.alarmRing;
    this.vibrate = vibrate ?? this.vibrate;
    this.snooze = snooze ?? this.snooze;
    this.isAlarmOn = isAlarmOn ?? this.isAlarmOn;
    notifyListeners();
  }
}

那么,对于一些更新警报的示例,它应该如下所示:

final alarmState = AlarmState();

// Add monday, wednesday and friday
alarmState.update(
    activeDays: alarmState.activeDays..addAll([
        Weekday.monday,
        Weekday.wednesday,
        Weekday.friday,
    ]),
);

// Remove monday
alarmState.update(
    activeDays: alarmState.activeDays..remove(Weekday.monday),
);

// Update hour and minute
alarmState.update(
    hour: 12,
    min: 30,
);

// Turn off the alarm
alarmState.update(
    isAlarmOn: false,
);

// Check whether the alarm should go off on monday
final isActiveOnMonday = alarmState.activeDays.contains(Weekday.monday);

【讨论】:

  • 我不太明白我将如何在Set&lt;Weekday&gt; activeDays 中使用enum Weekday,请您解释一下。谢谢!
  • 我已经编辑添加了一些使用示例 - 这有助于澄清它吗?检查Set 文档也可能会有所帮助:api.dart.dev/stable/2.15.1/dart-core/Set-class.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2020-06-26
  • 2020-12-01
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多