【发布时间】:2021-08-15 07:20:15
【问题描述】:
每个人。我是 Flutter 和 BLoC 模式的新手。
我需要实现联系人页面,所以我创建了事件 GetContacts 并将其传递到 context.read().add() 之后,我将此事件调用到联系人屏幕的 initState() 中。
这是我的活动:
abstract class ContactEvent extends Equatable {
const ContactEvent([List props = const []]) : super();
}
class GetContacts extends ContactEvent {
const GetContacts() : super();
@override
List<Object> get props => [];
}
这是我的集团:
class ContactsBloc extends Bloc<ContactEvent, ContactsState> {
final ContactsRepo contactsRepo;
ContactsBloc({required this.contactsRepo}) : super(ContactInitial());
@override
Stream<ContactsState> mapEventToState(ContactEvent event,) async* {
yield ContactsLoading();
//
// if (event is UpdatePhoto) {
// yield PhotoLoading();
//
// print("LOADING STARTED");
//
// final photo = await contactsRepo.updatePhoto(event.identifier, event.photo);
// print("LOADING FINISHED");
//
// yield PhotoLoaded(photo: photo);
// }
if (event is GetContacts) {
print("get contacts photoBloc");
try {
final contacts = await contactsRepo.getContacts();
yield ContactsLoaded(contacts);
} on AccessException {
yield ContactsError();
}
}
}
}
这工作正常,联系人页面按预期呈现联系人。
[联系人屏幕][1] [1]:https://i.stack.imgur.com/Gx3JA.png
但后来我决定实施新功能:当用户点击任何联系人时,他会被要求更改其照片。 如果我正确理解 BLoC 模式,那么如果我想改变我的状态,我需要创建新事件。然后我创建了新动作 UpdatePhoto 并将其传递到与第二部分代码(在 cmets 中)所示相同的 Bloc 中。正是在那里,我遇到了对架构扩展的误解。此操作不应该返回 ContactsLoaded 状态,因此当我尝试将其捕获到我的另一个 bloc 构建器中时,它破坏了我之前捕获 GetContact 事件的 bloc 构建器。
联系状态:
abstract class ContactsState extends Equatable {
const ContactsState([List props = const []]) : super();
}
// class PhotoLoading extends PhotoState {
// @override
// List<Object?> get props => [];
// }
//
// class PhotoLoaded extends PhotoState {
// final Uint8List photo;
// const PhotoLoaded({required this.photo});
// @override
// List<Object?> get props => [photo];
// }
class ContactInitial extends ContactsState {
@override
List<Object> get props => [];
}
class ContactsLoading extends ContactsState {
@override
List<Object> get props => [];
}
class ContactsLoaded extends ContactsState {
final List<MyContact> contacts;
ContactsLoaded(this.contacts) : super([contacts]);
@override
List<Object> get props => [contacts];
}
class ContactsError extends ContactsState {
@override
List<Object?> get props => [];
}
问题:如果我想创建新事件(例如 UpdatePhoto),它不应该返回我之前在同一个 bloc 中捕获的状态,那么我需要为此创建新 bloc 并通过 multiProvider 覆盖我的屏幕?
【问题讨论】: