flutter 我应该为块状态使用多个类还是一个类带有多个构造函数?

hfsqlsce  于 2023-01-31  发布在  Flutter
关注(0)|答案(2)|浏览(115)

我最近开始学习bloc,我注意到一些教程使用多个类来表示状态,而另一些教程只使用一个类来表示多个命名构造函数。
多个类的示例:

abstract class ProductsState {}

class ProductsInitial extends ProductsState {}

class ProductsLoading extends ProductsState {}

class ProductsSuccess extends ProductsState {
  final List<Products> products;

  ProductsSuccess(this.products);
}

class ProductsError extends ProductsState {
  final String error;

  ProductsError(this.error);
}

多个构造函数的示例:

enum AuthenticationStates {
  initial,
  success,
  error,
}

class AuthenticationState {
  final AuthenticationStates state;
  final Authentication model;
  final String msg;

  const AuthenticationState._(
      {this.state = AuthenticationStates.initial,
      this.model,
      this.msg = ''});

  const AuthenticationState.initial() : this._();

  const AuthenticationState.success(Authentication mdl)
      : this._(model: mdl, state: AuthenticationStates.success);

  const AuthenticationState.error(String m)
      : this._(state: AuthenticationStates.error, msg: m);
}

哪个更好用?

ni65a41a

ni65a41a1#

在我的项目中,我使用第一种方法,因为不同的状态类型是明确的,您可以稍后基于此构建您的UI,例如if (state is ProductsLoading) { show loader }
你也可以使用freezed包(https://pub.dev/packages/freezed)来生成这样的类,当你使用它的时候,你可以用不同的工厂构造函数来定义一个类(类似于你的第二个选项),但是生成的代码会支持你定义的第一个选项,例如:

@freezed
class Union with _$Union {
  const factory Union(int value) = Data;
  const factory Union.loading() = Loading;
  const factory Union.error([String message]) = ErrorDetails;
}

稍后,在UI层中,您可以使用帮助器方法(如map/maybeMap/when/maybeWhen)来构建基于状态的相应视图,例如:

var union = Union(42);

print(
  union.when(
    (int value) => 'Data $data',
    loading: () => 'loading',
    error: (String? message) => 'Error: $message',
  ),
); // Data 42
vmdwslir

vmdwslir2#

我也在问自己同样的问题。
“当你检查逻辑中示例的具体类型时,你就知道你没有正确地使用多态性。”-回到大学。
在BloC的文档中,他们在所有示例中使用一个带有枚举的类(或额外的状态类),枚举将由类似于SUCCESS FAILURE等的内容组成。
检查BloC文档中提到的PostState示例:https://bloclibrary.dev/#/flutterinfinitelisttutorial?id=post-states
尽管如此,状态的多个子类是flutter开发人员常用的做法。我觉得这是错误的,但谁知道呢...

相关问题