【问题标题】:Reducing verbosity of states in flutter_bloc library减少 flutter_bloc 库中状态的详细程度
【发布时间】:2021-01-04 20:01:47
【问题描述】:

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

我有以下状态:

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

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

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

  1. ChatState 成为唯一的状态,然后把所有东西都塞进去。似乎是一种反模式。
  2. chatmessagesusers 放入ChatState,以便所有州都有它们。但是,每个状态都有一个很长的构造函数,而且非常冗长,尤其是当这个屏幕会变得更加复杂时。

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

【问题讨论】:

  • 为什么要在加载状态下显示消息?您能否再解释一下业务逻辑,以便我们提出正确的解决方案?
  • @Limbou 说,例如,变量的缓存版本过时,或者用户可能做了“拉动刷新”。在加载新数据时仍然使用微调器显示旧数据(而不是仅使用微调器和空白屏幕或骨架),这是一种更好的用户体验。
  • 我认为在这种情况下最好将showLoading boolean 添加到ChatSuccess state
  • 你的意思是,当没有数据显示时保持其他状态,当数据被刷新时它变为ChatSuccess(old data) -&gt; ChatSuccess(oldData, loading) -&gt; ChatSuccess(newData)
  • 没错,就是这样。你肯定会有两种加载状态:一种是没有数据要显示(只是一个加载指示器),另一种是你已经有一些数据,但想刷新它。

标签: flutter dart bloc state-management


【解决方案1】:

由于帖子评论的建议似乎合理,我将其移至此处:

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

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

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

状态流程如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2014-11-14
    相关资源
    最近更新 更多