减少 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];
}
但是,我现在希望能够显示所有状态(如果不为空)的消息,甚至是错误或加载状态 - 它可能正在显示缓存。
看来我有两种方法可以做到这一点,但似乎都不是一个好的选择:
- 使
ChatState
成为唯一的状态,并将所有内容都塞进去。似乎是一种反模式。
- 将
chat
、messages
和 users
放入 ChatState
,以便所有州都有它们。但是,然后每个状态都有一个巨大的长构造函数,它真的很冗长,尤其是因为这个屏幕会变得更加复杂。
我现在选择 2,但这真的是最好的方法吗?我是否以正确的方式使用 bloc_library
?
鉴于post评论的建议似乎合理,我将其移动到这里:
如果我们按步骤考虑以下业务逻辑:
- 用户进入一个屏幕,他看到加载指示器(此处加载数据)
- 如果没有错误,他现在会看到一个包含之前获取的所有数据的视图
- 他可以按一个button/pull刷新数据
在这种情况下,我建议将 showLoading
布尔值添加到 ChatSuccess
状态。这样您就可以同时显示数据和旋转指标。
各州的流程如下:
ChatInProgress -> ChatSuccess(firstData, showLoading: false) -> (pull to refresh) -> ChatSuccess(firstData, showLoading: true) -> ChatSuccess(secondData, showLoading: false)
我正在实现一个简单的聊天屏幕,其中列出消息并有一个文本框和要发送的按钮。
我有以下状态:
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];
}
但是,我现在希望能够显示所有状态(如果不为空)的消息,甚至是错误或加载状态 - 它可能正在显示缓存。
看来我有两种方法可以做到这一点,但似乎都不是一个好的选择:
- 使
ChatState
成为唯一的状态,并将所有内容都塞进去。似乎是一种反模式。 - 将
chat
、messages
和users
放入ChatState
,以便所有州都有它们。但是,然后每个状态都有一个巨大的长构造函数,它真的很冗长,尤其是因为这个屏幕会变得更加复杂。
我现在选择 2,但这真的是最好的方法吗?我是否以正确的方式使用 bloc_library
?
鉴于post评论的建议似乎合理,我将其移动到这里:
如果我们按步骤考虑以下业务逻辑:
- 用户进入一个屏幕,他看到加载指示器(此处加载数据)
- 如果没有错误,他现在会看到一个包含之前获取的所有数据的视图
- 他可以按一个button/pull刷新数据
在这种情况下,我建议将 showLoading
布尔值添加到 ChatSuccess
状态。这样您就可以同时显示数据和旋转指标。
各州的流程如下:
ChatInProgress -> ChatSuccess(firstData, showLoading: false) -> (pull to refresh) -> ChatSuccess(firstData, showLoading: true) -> ChatSuccess(secondData, showLoading: false)