我最近开始学习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);
}
哪个更好用?
2条答案
按热度按时间ni65a41a1#
在我的项目中,我使用第一种方法,因为不同的状态类型是明确的,您可以稍后基于此构建您的UI,例如
if (state is ProductsLoading) { show loader }
。你也可以使用freezed包(https://pub.dev/packages/freezed)来生成这样的类,当你使用它的时候,你可以用不同的工厂构造函数来定义一个类(类似于你的第二个选项),但是生成的代码会支持你定义的第一个选项,例如:
稍后,在UI层中,您可以使用帮助器方法(如map/maybeMap/when/maybeWhen)来构建基于状态的相应视图,例如:
vmdwslir2#
我也在问自己同样的问题。
“当你检查逻辑中示例的具体类型时,你就知道你没有正确地使用多态性。”-回到大学。
在BloC的文档中,他们在所有示例中使用一个带有枚举的类(或额外的状态类),枚举将由类似于SUCCESS FAILURE等的内容组成。
检查BloC文档中提到的PostState示例:https://bloclibrary.dev/#/flutterinfinitelisttutorial?id=post-states
尽管如此,状态的多个子类是flutter开发人员常用的做法。我觉得这是错误的,但谁知道呢...