我有一个通过firebase保存用户数据的区块,它可以正常工作,但是当用户退出并再次登录时,我不能用新的用户数据更新区块。
例如:
用户_1(名称:一个)注销。然后User_2(名称:两个). Bloc状态中的符号仍保留来自User_1的数据
用户状态.dart
part of 'user_bloc.dart';
class UserState extends Equatable {
const UserState();
@override
List<Object?> get props => [];
}
class UserLoading extends UserState {
const UserLoading();
@override
List<Object> get props => [];
}
class UserLoaded extends UserState {
final UserFindine user;
UserLoaded({required this.user});
@override
List<Object> get props => [user];
}
用户事件.dart
part of 'user_bloc.dart';
class UserEvent extends Equatable {
const UserEvent();
@override
List<Object> get props => [];
}
class LoadUser extends UserEvent {
const LoadUser();
@override
List<Object> get props => [];
}
class UpdateUser extends UserEvent {
final UserFindine user;
const UpdateUser(this.user);
@override
List<Object> get props => [user];
}
用户块.dart
class UserBloc extends Bloc<UserEvent, UserState> {
final DatabaseRepository _databaseRepository;
StreamSubscription? _databaseSubscription;
UserBloc({
required DatabaseRepository databaseRepository,
}) : _databaseRepository = databaseRepository,
super(UserLoading()) {
on<LoadUser>((event, emit) {
_databaseSubscription?.cancel();
_databaseSubscription = _databaseRepository.getUser().listen((user) {
add(UpdateUser(user));
});
});
on<UpdateUser>((event, emit) {
final data = event.user; // This data is right.
emit(UserLoaded(user: data));
});
}
}
我尝试在用户登录时触发LoadUser事件,但仍然获取旧用户数据。我是否遗漏了什么?
谢谢你的帮助🔥
编辑:
在我的主.dart文件中:
MultiBlocProvider(
providers: [
BlocProvider<AuthBloc>(
create: (context) => AuthBloc(
authRepository: context.read<AuthRepository>(),
),
),
BlocProvider(
create: (_) => UserBloc(databaseRepository: DatabaseRepository())..add(LoadUser()),
),
],
),
我也用这个后,登录事件。
UserBloc(databaseRepository: DatabaseRepository())..add(LoadUser());
2条答案
按热度按时间vxqlmq5t1#
当我有一个以上的LoginBloc示例时,也发生了类似的情况。对于普通页面,重新创建Bloc是有用的,但对于登录,您不希望有一个以上的示例,或者在导航时重新创建它。
下面是一个使用AppRouter的示例,其中包含一个普通块和一个登录块,请检查它们之间的区别。我在代码中添加了一些注解。
您还可以尝试在代码中放置一个指向MultiblocProvider的断点以查看它是否被多次调用。
myzjeezk2#
只要在
final data = event.user;
行的上面加上emit(UserLoading());
就行了因为一旦发出了UserLoaded
状态,你又想发出同样的状态,它就不会重建BlocBuilder
,所以我更喜欢在一个方法中发出两个不同的状态。