dart - 未调用异步方法

标签 dart flutter

我想将一个 bloc 逻辑分成不同的方法,但出于某种原因,当我这样做时它不会等待 doLogIn()。我不确定自己做错了什么。

@override
Stream<AuthState> mapEventToState(
  AuthState currentState,
  AuthEvent event,
) async* {
  if (event is LogIn) {
    await doLogIn();
  }
}

doLogIn() async* {
  try {
    final userId = await _authRepository.signIn("xxxxxxxxxx@gmail.com", "xxxxxxxxxx");
    yield AuthLogInSuccess();
    final user = await _authRepository.getCurrentUser();
    yield AuthUserAvailable(firebaseUser: user);
  } catch (e) {
    print(e);
    yield AuthError();
  }
}

最佳答案

下面是如何分离 bloc 逻辑的示例:

明确 Bloc :

class LoginBloc extends Bloc<LoginEvent, LoginState> {

  @override
  LoginState get initialState => new Loading();


  @override
  Stream<LoginState> mapEventToState(
      LoginState currentState,
      LoginEvent event,
      ) async* {

    final newState = await event.getNewState(currentState);
    yield newState;
  }
}

状态:

abstract class LoginState { }

class Loading extends LoginState { }

class LoginFailed extends LoginState {
  final String message;

  LoginFailed(this.message);
}

class LoginSuccessfulComplete extends LoginState  {
  final User user;

  LoginSuccessfulComplete(this.user);
}

我建议将转换逻辑放入事件中:

abstract class LoginEvent {
  Future<LoginState> getNewState(LoginState state);
}

class AuthLoading extends LoginEvent {

  @override
  Future<LoginState> getNewState(LoginState state) async{    
    final _authService = new AuthService();
    final UserIndentity identity = await _authService.onLoad();

    if (identity.isEmpty) {
      return PhoneEnter();
    }

    final user = await _authService.login(identity);
    if (user == null){
      return LoginFailed('user not found');
    }
    return LoginSuccessfulComplete(user);
  }
}

关于dart - 未调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55269783/

相关文章:

dart - 如何格式化要在 Flutter 中显示的文本

ios - Flutter 应用程序未在模拟器上启动。由于不是 'return a valid pid nor a launch error'而退出

flutter - 如何访问 showModalBottomSheet 中提供的 (Provider.of()) 值?

dart - Flutter - 删除 Dart 中的转义序列

flutter - 用=> 启动flutter 时如何调用多条语句?

java - 在 Dart 中解密 Java AES 编码的字符串

android - flutter 错误 : 'ScrollController not attached to any scroll views.' on scroll

flutter - 如何在flutter中获取整个list.builder的高度

flutter - 如何知道 flutter app 是否处于生产模式?

flutter - 如何创建返回小部件数组的函数