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 以及如何有效处理登录事件和状态的最佳实践提供任何指导或建议,我将不胜感激。
如果您想使用 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()));
}
}
}