我只是想知道,拥有不同的状态和拥有一个具有属性status的状态来表示状态的当前状态(例如,它是成功还是错误)之间有区别吗?有没有国家声明的最佳实践,比如什么时候是使用一种状态的最佳时机,或者是一种比另一种更受欢迎?

我从官方的集团文件中看到了这一点,其中Timer Bloc tutorial使用的是不同的状态.有TimerInitial、TimerRunInProgress、TimerRunPue和TimerRunComplete.他们都有一套duration的房产.

abstract class TimerState extends Equatable {
  const TimerState(this.duration);
  final int duration;

  @override
  List<Object> get props => [duration];
}

class TimerInitial extends TimerState {
  const TimerInitial(super.duration);

  @override
  String toString() => 'TimerInitial { duration: $duration }';
}

class TimerRunPause extends TimerState {
  const TimerRunPause(super.duration);

  @override
  String toString() => 'TimerRunPause { duration: $duration }';
}

class TimerRunInProgress extends TimerState {
  const TimerRunInProgress(super.duration);

  @override
  String toString() => 'TimerRunInProgress { duration: $duration }';
}

class TimerRunComplete extends TimerState {
  const TimerRunComplete() : super(0);
}

这也可以用这种方式编码,对吗?

enum TimerStatus{
  initial, 
  runPause,
  runInProgress,
  runComplete,
}

class TimerState extends Equatable{
  const TimerState(this.duration, this.status);
  final int duration;
  final TimerStatus status;

  @override
  List<Object> get props => [duration, status];
}

Todos应用程序的官方块文档中也有一个这种方法的例子.

enum TodosOverviewStatus { initial, loading, success, failure }

class TodosOverviewState extends Equatable {
  const TodosOverviewState({
    this.status = TodosOverviewStatus.initial,
    this.todos = const [],
    this.filter = TodosViewFilter.all,
    this.lastDeletedTodo,
  });

  final TodosOverviewStatus status;
  final List<Todo> todos;
  final TodosViewFilter filter;
  final Todo? lastDeletedTodo;

  ...

  @override
  List<Object?> get props => [
        status,
        todos,
        filter,
        lastDeletedTodo,
      ];
}

作为BLOC的初学者,我很好奇哪种情况更适合哪种情况.那么,使用这两种方法中的任何一种有什么优势吗?哪种情况最适合不同的州与具有状态属性的一个州的方法?

推荐答案

我看到的唯一优势是您可以使用第一个变体生成密封类(https://pub.dev/packages/freezed).

另外,我认为两者的目的是相同的,尽管第二个变体(Enum State)当然更紧凑.

仅当每个状态具有相同的变量时,枚举状态变量才有意义.如果您有一个包含int的已加载状态和一个只应指示错误/进度指示器的加载/错误状态,那么您当然不希望将int置于加载/错误状态,因为它不属于那里.

然而,我在这里只是根据我自己的经验说的:)

Flutter相关问答推荐

Android Emulator冻结,但在调整窗口大小时解冻

如何在默认情况下隐藏appBar并在向下滚动时显示它- Flutter

Flutter -如何将导航轨道标签靠左对齐?

Firebase动态链接已弃用,不应在新项目中使用.Flutter 替代方案

如何删除使用isscllable时出现的左边距?

FOR回路中的Flutter 模型

Flutter GestureDetector单击问题-堆叠外面的按钮不可点击

Flutter 日期时间格式

集装箱堆放和定位时的高度问题

如何在 Flutter 中以背景 colored颜色 制作圆圈的一部分

没有为类型 'Widget' 定义运算符 '[]' .try 定义运算符[]

Flutter开发中,如何通过'nfc_manager'插件在Android设备上避免默认的New Tag Scanned弹出窗口?

无法在 ListView (Flutter) 中限制 Card 的最大宽度

如何从 Flutter 中的 App2 远程点击 App1 中的按钮

对话框打开时如何使背景模糊?

Flutter - 定义按钮的优雅方式

如何在 Flutter 执行通知时运行后台代码?

如何修复int类型不是String类型的子类型

Flutter Firestore 数据库排序最近 24 小时内最喜欢的文档

Navigator.push '!_debugLocked' 上的错误:不正确