【问题标题】:when should we use freezed as sealed classes or constructor?我们什么时候应该使用 freezed 作为密封类或构造函数?
【发布时间】:2021-11-16 19:01:58
【问题描述】:

在 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,
      );
}

【问题讨论】:

    标签: flutter bloc flutter-bloc freezed flutter-freezed


    【解决方案1】:

    TL;DR:我认为没有正确的方法,只有适合你的方法。

    使用 freezed 时,每个工厂构造函数都会生成一个单独的类。除此之外,它还会生成一些方便的方法,例如map/maybeMap/when/maybeWhen。当您的 BLoC 具有明显且不同的状态并且您希望相应地处理您的 UI 时,这非常方便。例如:initialloadInProgressloadSuccessloadFailure。然后,在您的 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 中并且您想要验证/更新它们时,提交稍后的表格)最好使用具有属性的单个状态。更好,我的意思是这样更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2021-09-07
      • 2021-05-15
      • 2018-09-11
      • 2011-03-18
      相关资源
      最近更新 更多