firebase Flutter 阻塞:^8.0.0状态未更新

nkkqxpd9  于 2022-12-14  发布在  Flutter
关注(0)|答案(2)|浏览(117)

我有一个通过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());
vxqlmq5t

vxqlmq5t1#

当我有一个以上的LoginBloc示例时,也发生了类似的情况。对于普通页面,重新创建Bloc是有用的,但对于登录,您不希望有一个以上的示例,或者在导航时重新创建它。
下面是一个使用AppRouter的示例,其中包含一个普通块和一个登录块,请检查它们之间的区别。我在代码中添加了一些注解。
您还可以尝试在代码中放置一个指向MultiblocProvider的断点以查看它是否被多次调用。

class AppRouter {
  late Repository repository;
  LoginCubit? loginCubit; //declare global login Bloc

  AppRouter() {
    repository = Repository(apiClient: ApiClient());
    loginCubit = LoginCubit(repository: repository); //create the Bloc once
  }

  Route? generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case "/":
        return MaterialPageRoute(
          builder: (_) => BlocProvider.value( // use Blocprovider.value which will not create a new Bloc but use the one declared before
            value: loginCubit!,
            child: const LoginPage(key: null),
          ),
        );
      case "/main_page":
        final args = settings.arguments as Map;
        return MaterialPageRoute(
          builder: (_) => BlocProvider(
            create: (context) =>
                OtherCubit( repository: repository),
            child: OtherPage(),
          ),
        );  
     }
   }
}
myzjeezk

myzjeezk2#

只要在final data = event.user;行的上面加上emit(UserLoading());就行了因为一旦发出了UserLoaded状态,你又想发出同样的状态,它就不会重建BlocBuilder,所以我更喜欢在一个方法中发出两个不同的状态。

相关问题