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"
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
我尝试了降级 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"