dardo - Mejores prácticas de clase Flutter BLoC/Cubit STATE

CorePress2024-01-24  10

Soy nuevo en el uso de Bloc y Cubit, así que estoy tratando de descubrir algunas de las mejores prácticas específicamente con el componente Estado. Tengo una aplicación Todos simple donde Todos pueden estar en varios estados diferentes:

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;
}

Mi pregunta es: ¿debería mantener la Lista<Todo> ¿Todos en la subclase TodosLoaded o debería trasladarse a la clase base? Mi opinión es que al moverlo a la clase base, mi estado TodosEmpty sería redundante porque simplemente podría verificar si la lista de todos está vacía en la interfaz de usuario. Si este es el caso, ¿debería mover también el error de cadena a la clase base?

Estoy seguro de que cada enfoque tiene ventajas y desventajas, solo espero compartir ideas con cualquiera que tenga más experiencia con Bloc.



------------------------------------

Intenta usar Cubit, simplifica mucho el código.

Probablemente crearía una función addToDo(todoItem) y removeToDo(todoItem) en la clase cubit que actualiza la lista y emite el cambio. La variable de lista estaría en Cubit, y podrá hacer referencia a esta lista desde el widget utilizando context.read<TodoCubit>().todoList.

Y usarás las funciones así: context.read<TodoCubit>().addToDo(todoItem)

He escrito un tutorial sobre el mejor enfoque para la implementación de Cubit Flutter | Autenticación de Firebase con Cubit (Bloc) — Tutorial 1 de 2

Creo que este artículo te será de mucha ayuda. Échale un vistazo 🤓

1

Ya estoy usando Cubit. Me preguntaba cuáles son las mejores prácticas al diseñar cada uno de mis estados y si la lista de todos debería estar en TodosState o TodosLoaded.

-rejy11

28/04/2021 a las 11:50



------------------------------------

Para alguien que esté revisando este hilo, tener estados como TodosEmpty y TodosLoaded con la lista de todos está muy bien. Aunque yo iría con fr.paquete eezed y simplificarlo, como lo hice con mi aplicación:

parte de 'books_list_cubit.dart';

@freezed
class BooksListPageState with _$BooksListPageState {
  const factory BooksListPageState.loading() = BooksListPageLoading;

  const factory BooksListPageState.empty() = BooksListPageEmpty;

  const factory BooksListPageState.success(List<Book> books) = BooksListPageSuccess;
}

Hay más información sobre esto en mi tutorial Flutter codos + ganchos + Hive DB.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare