Unhandled error LateInitializationError: Local 'failureOrSuccess' has not been initialized. occurred in Instance of 'SignInFormBloc'

Unhandled error LateInitializationError: Local 'failureOrSuccess' has not been initialized. occurred in Instance of 'SignInFormBloc'

Stream<SignInFormState> _performActionOnAuthFacadeWithEmailAndPassword(
Future<Either<AuthFailure, Unit>> Function({
  @required EmailAddress emailAddress,
  @required Password password,
})
    forwardedCall,
) async* {
Either<AuthFailure, Unit> failureOrSuccess;

final isEmailValid = state.emailAddress.isValid();
final isPasswordValid = state.password.isValid();

if (isEmailValid && isPasswordValid) {
  yield state.copyWith(
    isSubmitting: true,
    authFailureOrSuccessOption: none(),
  );

  failureOrSuccess = await forwardedCall(
    emailAddress: state.emailAddress,
    password: state.password,
  );
}

yield state.copyWith(
  isSubmitting: false,
  showErrorMessages: true,
  authFailureOrSuccessOption: optionOf(failureOrSuccess),
);

}

这在Resocoder's DDD tutorial中运行良好,但自从Flutter的NNBD以来,我们需要在

中添加late关键字
Either<AuthFailure, Unit> failureOrSuccess;

所以它变为:

late Either<AuthFailure, Unit> failureOrSuccess;

现在错误在:

yield state.copyWith(
isSubmitting: false,
showErrorMessages: true,
authFailureOrSuccessOption: optionOf(failureOrSuccess),
);

自从我们添加了 late 关键字后就消失了。

但是,当我们在表单中测试电子邮件地址验证时,出现以下错误。因此,我们没有在 TextFormField 中收到红色警报,而是收到以下错误:

[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Unhandled error 
LateInitializationError: Local 'failureOrSuccess' has not been initialized. occurred in 
Instance of 'SignInFormBloc'.

正在删除 Either failureOrSuccess 中的 late 关键字;由于 Flutter SDK 中默认为 null-safety,再次抛出相同的错误。

我尝试了降级 flutter 和更多的东西,但似乎没有解决方法。 有人可以帮忙吗?

好的,找到问题的答案只需替换以下代码:

Stream<SignInFormState> _performActionOnAuthFacadeWithEmailAndPassword(
Future<Either<AuthFailure, Unit>> Function({
  @required EmailAddress emailAddress,
  @required Password password,
})
    forwardedCall,
) async* {
Either<AuthFailure, Unit> failureOrSuccess;

final isEmailValid = state.emailAddress.isValid();
final isPasswordValid = state.password.isValid();

if (isEmailValid && isPasswordValid) {
  yield state.copyWith(
    isSubmitting: true,
    authFailureOrSuccessOption: none(),
  );

  failureOrSuccess = await forwardedCall(
    emailAddress: state.emailAddress,
    password: state.password,
  );
}

yield state.copyWith(
  isSubmitting: false,
  showErrorMessages: true,
  authFailureOrSuccessOption: optionOf(failureOrSuccess),
);
}

与:

Stream<SignInFormState> _performActionOnAuthFacadeWithEmailAndPassword(
Future<Either<AuthFailure, Unit>> Function({
  required EmailAddress emailAddress,
  required Password password,
})
    forwardedCall,
) async* {
Either<AuthFailure, Unit> failureOrSuccess;

final isEmailValid = state.emailAddress.isValid();
final isPasswordValid = state.password.isValid();

if (isEmailValid && isPasswordValid) {
  yield state.copyWith(
    isSubmitting: true,
    authFailureOrSuccessOption: none(),
  );

  failureOrSuccess = await forwardedCall(
    emailAddress: state.emailAddress,
    password: state.password,
  );
  yield state.copyWith(
    isSubmitting: false,
    showErrorMessages: AutovalidateMode.always,
    authFailureOrSuccessOption: optionOf(failureOrSuccess),
  );
} else {
  yield state.copyWith(
    isSubmitting: false,
    showErrorMessages: AutovalidateMode.always,
    authFailureOrSuccessOption: none(),
  );
}
}

这里不需要 late 关键字,因为 if-else 条件正在调用 failureOrSuccess 变量,因此在每种情况下,failureOrSuccess 都会获得一些值,在 else 条件下它是 none()。该代码现在可以正常工作,因为当我们尝试进行无效登录时,我们仍然会在表单 UI 中收到红色警报。

如果我找到更好的选择,我会更新我的答案。

PS: 我的环境在 pubspec.yaml 文件中:

environment:
 sdk: ">=2.12.0 <3.0.0"