为什么状态不好:在没有注册事件处理程序的情况下调用了 add(LoginEvent)。确保通过 on<LoginEvent>((event,emit){...})

问题描述 投票:0回答:1

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:pooling_apps/data/repositories/auth_repository.dart';
import 'package:pooling_apps/models/user_model.dart';
import 'auth_event.dart';
import 'auth_state.dart';

class AuthBloc extends Bloc<AuthEvent, AuthState> {
  final AuthRepository authRepository;

  AuthBloc({required this.authRepository}) : super(AuthInitial());

  Stream<AuthState> mapEventToState(AuthEvent event) async* {
    if (event is LoginEvent) {
      yield AuthLoading();
      try {
        final UserModel? user =
            await authRepository.login(event.username, event.password);
        yield AuthAuthenticated(user: user!);
      } catch (e) {
        yield AuthError(message: e.toString());
      }
    }
  }
}


我正在尝试在我的 Flutter 应用程序中实现 BLoC 模式进行状态管理,特别是登录功能。我已经建立了基本结构,但在管理状态和正确处理身份验证方面遇到了一些问题。对于构建我的 BLoC 以及如何有效处理登录事件和状态的最佳实践提供任何指导或建议,我将不胜感激。

flutter authentication bloc
1个回答
0
投票

如果您想使用 BLoC 模式作为状态管理,并使用 flutter_bloc 作为 BLoC 模式的暗示,那么您应该使用最新版本。正如你所看到的这里

mapEventToState 被删除,取而代之的是 on

所以你现在应该做这样的事情:

class AuthBloc extends Bloc<AuthEvent, AuthState> {
  AuthBloc({required AuthRepository authRepository})
      : _authRepository = authRepository,
        super(AuthInitial()) {
    on<LoginEvent>(_onLoginEvent);
  }

  final AuthRepository _authRepository;

  Future<void> _onLoginEvent(LoginEvent event, Emitter<AuthState> emit) async {
    try {
      emit(AuthLoading());
      final user = await _authRepository.login(event.username, event.password);
      emit(
        user == null
            ? const AuthError(message: 'User not exist')
            : AuthAuthenticated(user: user),
      );
    } catch (e) {
      emit(AuthError(message: e.toString()));
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.