在我的应用程序中,我添加了一个监听文档更改的流(该文档包含一些
String
字段和 List<String>
数组)
区块代码:
void _onPageHomeGetUserData(
PageHomeGetUserDataEvent event,
Emitter<PageHomeState> emit,
) async {
final currentUser = _authService.currentUser();
_userStreamSubscription = _userRepository
.getDocumentStream(
'${FirestoreConstants.userCollection}/${currentUser.id}')
.listen((event) {
add(PageHomeGetUserDataEmitEvent(event));
});
}
void _onPageHomeGetUserDataEmitEvent(
PageHomeGetUserDataEmitEvent event,
Emitter<PageHomeState> emit,
) async {
emit(state.copyWith(userData: event.userData));
}
区块状态:
class PageHomeState extends Equatable {
final PageState pageState;
final UserEntity userData;
final List<EventStatusEntity> events;
const PageHomeState({
this.pageState = PageState.initial,
this.userData = const UserEntity(
email: '',
events: [],
name: '',
reports: [],
id: '',
),
this.events = const [],
});
@override
List<Object> get props => [pageState, userData, events];
PageHomeState copyWith({
PageState? pageState,
UserEntity? userData,
List<EventStatusEntity>? events,
}) {
return PageHomeState(
pageState: pageState ?? this.pageState,
userData: userData ?? this.userData,
events: events ?? this.events,
);
}
}
用户实体:
class UserEntity extends Equatable implements Serializable {
final String email;
final List<String> events;
final String name;
final List<String> reports;
final String id;
const UserEntity({
required this.email,
required this.events,
required this.name,
required this.reports,
required this.id,
});
@override
Map<String, dynamic> toMap() {
return {
'email': email,
'events': events,
'name': name,
'reports': reports,
'id': id,
};
}
@override
List<Object> get props {
return [
email,
events,
name,
reports,
id,
];
}
UserEntity copyWith({
String? email,
List<String>? events,
String? name,
List<String>? reports,
String? id,
}) {
return UserEntity(
email: email ?? this.email,
events: events ?? this.events,
name: name ?? this.name,
reports: reports ?? this.reports,
id: id ?? this.id,
);
}
}
通过按下按钮,我更新文档(我已检查并且文档更新正确),但
UI
不更新
奇怪的是,我尝试手动更改 firestore 中的文档,并且 ui 也会相应更新
问题似乎出在这段代码上:
void _onPageHomeSwitchFavoriteEvent(
PageHomeSwitchFavoriteEvent event,
Emitter<PageHomeState> emit,
) async {
final userData = state.userData;
if (event.isFavorite) {
userData.events.remove(event.eventId);
} else {
userData.events.add(event.eventId);
}
_userRepository.update(
'${FirestoreConstants.userCollection}/${userData.id}',
userData,
);
}
现在我已将其更改为:
void _onPageHomeSwitchFavoriteEvent(
PageHomeSwitchFavoriteEvent event,
Emitter<PageHomeState> emit,
) async {
final userData = state.userData;
List<String> tempList = [];
tempList.addAll(userData.events);
if (event.isFavorite) {
tempList.remove(event.eventId);
} else {
tempList.add(event.eventId);
}
_userRepository.update(
'${FirestoreConstants.userCollection}/${userData.id}',
userData.copyWith(events: tempList),
);
}
有效