我们什么时候应该使用 freezed as sealed 类 或构造函数?
when should we use freezed as sealed classes or constructor?
在 bloc 中使用冻结库的方式是什么?第一个是密封的类,另一个是构造函数。
第一种方式
abstract class HomeState with _$HomeState {
const factory HomeState.initial() = _Initial;
const factory HomeState.addNewNoteButtonClicked(@Default(false) bool isClicked) = AddNewNoteClicked;
factory HomeState.addNewNote( Note value) = AddNewNote;
}
第二种方式:
abstract class HomeState with _$HomeState {
const factory HomeState({
required Note value,
required bool isClicked,
}) = AddNewNoteClicked;
factory HomeState.init() => HomeState(
value: Note(value: ''),
isClicked: false,
);
}
TL;DR:我认为没有正确的方法,只有适合您的方法。
使用冻结时,每个工厂构造函数都会生成一个单独的 class。与此同时,它会生成一些方便的方法,例如 map
/maybeMap
/when
/maybeWhen
。当您的 BLoC 具有明显且不同的状态并且您想相应地处理您的 UI 时,这非常方便。例如:initial
、loadInProgress
、loadSuccess
、loadFailure
。然后,在您的 UI 中,您可以使用如下内容:
class Example extends StatelessWidget {
const Example();
@override
Widget build(BuildContext context) {
return BlocBuilder<ExampleCubit, ExampleState>(
builder: (_, state) => state.maybeWhen(
loadInProgress: () => const LoaderView(),
loadFailure: () => const ErrorView(),
loadSuccess: (categories) => const SomeView(),
orElse: () => const SizedBox(),
),
);
}
}
但是,当你需要从特定的状态中获取数据时,也会带来一些不便:你必须检查该状态是否是特定的状态,然后才能用你的代码处理,例如:
if (state is ExampleStateSuccess) {
...
}
在这种情况下,当你只需要一个状态但有很多不同的属性时(一个很好的例子是表单验证,当你将所有字段属性存储在你的 BLoC 中并且你想要 validate/update 他们,稍后提交表格)最好使用具有属性的单一状态。更好,我的意思是这样更容易。
在 bloc 中使用冻结库的方式是什么?第一个是密封的类,另一个是构造函数。
第一种方式
abstract class HomeState with _$HomeState {
const factory HomeState.initial() = _Initial;
const factory HomeState.addNewNoteButtonClicked(@Default(false) bool isClicked) = AddNewNoteClicked;
factory HomeState.addNewNote( Note value) = AddNewNote;
}
第二种方式:
abstract class HomeState with _$HomeState {
const factory HomeState({
required Note value,
required bool isClicked,
}) = AddNewNoteClicked;
factory HomeState.init() => HomeState(
value: Note(value: ''),
isClicked: false,
);
}
TL;DR:我认为没有正确的方法,只有适合您的方法。
使用冻结时,每个工厂构造函数都会生成一个单独的 class。与此同时,它会生成一些方便的方法,例如 map
/maybeMap
/when
/maybeWhen
。当您的 BLoC 具有明显且不同的状态并且您想相应地处理您的 UI 时,这非常方便。例如:initial
、loadInProgress
、loadSuccess
、loadFailure
。然后,在您的 UI 中,您可以使用如下内容:
class Example extends StatelessWidget {
const Example();
@override
Widget build(BuildContext context) {
return BlocBuilder<ExampleCubit, ExampleState>(
builder: (_, state) => state.maybeWhen(
loadInProgress: () => const LoaderView(),
loadFailure: () => const ErrorView(),
loadSuccess: (categories) => const SomeView(),
orElse: () => const SizedBox(),
),
);
}
}
但是,当你需要从特定的状态中获取数据时,也会带来一些不便:你必须检查该状态是否是特定的状态,然后才能用你的代码处理,例如:
if (state is ExampleStateSuccess) {
...
}
在这种情况下,当你只需要一个状态但有很多不同的属性时(一个很好的例子是表单验证,当你将所有字段属性存储在你的 BLoC 中并且你想要 validate/update 他们,稍后提交表格)最好使用具有属性的单一状态。更好,我的意思是这样更容易。