代码之家  ›  专栏  ›  技术社区  ›  Назар Марцинко

Flutter中的StateError

  •  0
  • Назар Марцинко  · 技术社区  · 1 年前

    如何修复此错误:在没有注册事件处理程序的情况下调用了StateError(错误状态:add(SignUp Button Pressed))。请确保通过在((event,emit){…})上注册处理程序

    SignUpBloc:

    import 'package:bloc/bloc.dart';
    import 'package:equatable/equatable.dart';
    import '../../domain/repositories/user_repository.dart';
    
    part 'sign_up_event.dart';
    part 'sign_up_state.dart';
    
    class SignUpBloc extends Bloc<SignUpEvent, SignUpState> {
      final UserRepository userRepository;
    
      SignUpBloc({required this.userRepository}) : super(SignUpInitial());
    
      @override
      Stream<SignUpState> mapEventToState(SignUpEvent event) async* {
        if (event is SignUpButtonPressed) {
          yield SignUpLoading();
    
          try {
            final email = event.email;
            final password = event.password;
    
            
            final result = await userRepository.registerUser(email, password);
            
            yield result.fold(
              (failure) => SignUpError(message: failure.toString()),
              (user) => SignUpSuccess(email: user.email),
            );
          } catch (error) {
            yield SignUpError(message: error.toString());
          }
        }
      }
    }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   ryandra    1 年前

    根据你的错误,我有另一种使用bloc的方法 handler via on((event, emit) {...})) .

    import 'package:bloc/bloc.dart';
    import 'package:equatable/equatable.dart';
    import '../../domain/repositories/user_repository.dart';
    
    part 'sign_up_event.dart';
    part 'sign_up_state.dart';
    
    class SignUpBloc extends Bloc<SignUpEvent, SignUpState> {
      final UserRepository userRepository;
    
      SignUpBloc({required this.userRepository}) : super(SignUpInitial());
    
      on<SignUpEvent>((event, emit) async {
        emit(SignUpLoading());
    
        try {
          final email = event.email;
          final password = event.password;
    
          
          final result = await userRepository.registerUser(email, password);
          
          await result.fold(
            (failure) async => emit(SignUpError(message: failure.toString())),
            (user) async => emit(SignUpSuccess(email: user.email),
          ));
        } catch (error) {
          emit(SignUpError(message: error.toString()));
        }
      });
    }
    

    请理解集团的概念。Bloc有3个文件, event || bloc || state .

    1. 事件用于对集团的任何输入。
    2. Bloc是您想对来自的输入数据变量执行的任何操作 事件
    3. 国家是集团的产物,永远使用 emit() .
        2
  •  0
  •   dpz.314    1 年前

    mapEventToState方法通常用于Flutter Blob库的旧版本中。

    对于新版本

    class SignUpBloc extends Bloc<SignUpEvent, SignUpState> {
      SignUpBloc({required this.userRepository}) : super(SignUpInitial()){
        on<SignUpButtonPressed>(_handleSignUpButtonPressed);
      };
    
      final UserRepository userRepository;
      
      Future _handleSignUpButtonPressed(SignUpButtonPressed event, Emitter<SignUpState> emit) async {
        emit(SignUpLoading());
        //...
        //your logic
      }
    }