【发布时间】: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),甚至是错误或加载状态 - 它可能正在显示缓存。
我似乎有两种方法可以做到这一点,但似乎都不是一个好的选择:
- 让
ChatState成为唯一的状态,然后把所有东西都塞进去。似乎是一种反模式。 - 将
chat、messages和users放入ChatState,以便所有州都有它们。但是,每个状态都有一个很长的构造函数,而且非常冗长,尤其是当这个屏幕会变得更加复杂时。
我现在选择 2,但这真的是最好的方法吗?我是否以正确的方式使用bloc_library?
【问题讨论】:
-
为什么要在加载状态下显示消息?您能否再解释一下业务逻辑,以便我们提出正确的解决方案?
-
@Limbou 说,例如,变量的缓存版本过时,或者用户可能做了“拉动刷新”。在加载新数据时仍然使用微调器显示旧数据(而不是仅使用微调器和空白屏幕或骨架),这是一种更好的用户体验。
-
我认为在这种情况下最好将
showLoadingboolean 添加到ChatSuccessstate -
你的意思是,当没有数据显示时保持其他状态,当数据被刷新时它变为
ChatSuccess(old data) -> ChatSuccess(oldData, loading) -> ChatSuccess(newData)? -
没错,就是这样。你肯定会有两种加载状态:一种是没有数据要显示(只是一个加载指示器),另一种是你已经有一些数据,但想刷新它。
标签: flutter dart bloc state-management