减少 flutter_bloc 库中状态的冗长

Reducing verbosity of states in flutter_bloc library

我正在实现一个简单的聊天屏幕,其中列出消息并有一个文本框和要发送的按钮。

我有以下状态:

abstract class ChatState extends Equatable {
  const ChatState();

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

class ChatFailure extends ChatState {
  final Exception reason;
  const ChatFailure({this.reason});

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

class ChatInProgress extends ChatState {}

class ChatSuccess extends ChatState {
  final Chat chat;
  final List<Message> messages;
  final Map<int, User> users;

  const ChatSuccess({
    @required this.chat,
    @required this.messages,
    @required this.users,
  });

  @override
  List<Object> get props => [chat, messages, users];
}

但是,我现在希望能够显示所有状态(如果不为空)的消息,甚至是错误或加载状态 - 它可能正在显示缓存。

看来我有两种方法可以做到这一点,但似乎都不是一个好的选择:

  1. 使 ChatState 成为唯一的状态,并将所有内容都塞进去。似乎是一种反模式。
  2. chatmessagesusers 放入 ChatState,以便所有州都有它们。但是,然后每个状态都有一个巨大的长构造函数,它真的很冗长,尤其是因为这个屏幕会变得更加复杂。

我现在选择 2,但这真的是最好的方法吗?我是否以正确的方式使用 bloc_library

鉴于post评论的建议似乎合理,我将其移动到这里:

如果我们按步骤考虑以下业务逻辑:

  1. 用户进入一个屏幕,他看到加载指示器(此处加载数据)
  2. 如果没有错误,他现在会看到一个包含之前获取的所有数据的视图
  3. 他可以按一个button/pull刷新数据

在这种情况下,我建议将 showLoading 布尔值添加到 ChatSuccess 状态。这样您就可以同时显示数据和旋转指标。

各州的流程如下:

ChatInProgress -> ChatSuccess(firstData, showLoading: false) -> (pull to refresh) -> ChatSuccess(firstData, showLoading: true) -> ChatSuccess(secondData, showLoading: false)