Flutter BLoC/Cubit STATE 类最佳实践

Posted

技术标签:

【中文标题】Flutter BLoC/Cubit STATE 类最佳实践【英文标题】:Flutter BLoC/Cubit STATE class best practices 【发布时间】:2021-06-24 04:26:00 【问题描述】:

我是使用 Bloc 和 Cubit 的新手,所以我试图找出一些专门针对 State 组件的最佳实践。我有一个简单的 Todos 应用程序,其中的 Todos 可以处于多种不同的状态:

part of 'todos_cubit.dart';

abstract class TodosState extends Equatable 
  const TodosState();

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


class TodosLoading extends TodosState 

class TodosLoaded extends TodosState 
  final List<Todo> todos;

  TodosLoaded(this.todos);

  @override
  bool operator ==(Object other) 
    if (identical(this, other)) return true;

    return other is TodosLoaded && listEquals(other.todos, todos);
  

  @override
  int get hashCode => todos.hashCode;


class TodosEmpty extends TodosState 

class TodosError extends TodosState 
  final String error;

  TodosError(this.error);

  @override
  bool operator ==(Object other) 
    if (identical(this, other)) return true;

    return other is TodosError && other.error == error;
  

  @override
  int get hashCode => error.hashCode;

我的问题是,我应该将List&lt;Todo&gt; todos 保留在TodosLoaded 子类中还是应该将其移至基类?我的想法是,通过将它移动到基类,它会使我的TodosEmpty 状态变得多余,因为我可以简单地检查 UI 中的待办事项列表是否为空。如果是这种情况,我是否也应该将String error 移至基类?

我确信每种方法都有利有弊,只是希望能向任何对 Bloc 有更多经验的人提出想法。

【问题讨论】:

【参考方案1】:

尝试使用 Cubit,它大大简化了代码。

我可能会在 cubit 类中创建一个函数 addToDo(todoItem)removeToDo(todoItem) 来更新列表并发出更改。列表变量将在 Cubit 中,您将通过使用 context.read&lt;TodoCubit&gt;().todoList 从小部件中引用此列表。

你会像这样使用函数:context.read&lt;TodoCubit&gt;().addToDo(todoItem)

我已经编写了 Cubit 实现最佳方法的教程Flutter | Firebase Authentication with Cubit (Bloc) — Tutorial 1 of 2

我认为这篇文章会对你有很大帮助。看看?

【讨论】:

我已经在使用 Cubit 了。我只是想知道在设计我的每个状态时的最佳实践,以及待办事项列表是否应该在 TodosState 或 TodosLoaded 中。

以上是关于Flutter BLoC/Cubit STATE 类最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用 Bloc/Cubit 时绕过 CONTEXT

使用 Bloc/Cubit 进行 Flutter 状态管理

具有多个firebase请求的flutter bloc cubit最佳实践

我应该先启动 Cubit,然后再将代码重构为 Bloc 吗?

使用相同 Bloc/Cubit 的多个 BlocBuilder,每个 BlocBuilder 用于不同的事件

我正在借助 bloc(cubit)创建异步计数器应用程序,每次计数器返回 0 时我都会发出加载状态