- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我正在使用 Django REST 框架创建我的 API 和所有内容。我想检查我是否可以从后端获得响应。所以,我能够得到回应。但是我在调试控制台上看到了一些问题。请帮我找出问题所在。这是我在调试控制台上收到的。
Restarted application in 1,314ms.
I/flutter ( 1751): {"token":"0d15f2d45f11869174395d623c066080bd2ade52"}
E/flutter ( 1751): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: 'package:bloc/src/bloc.dart': Failed assertion: line 232 pos 7: '!_isCompleted':
E/flutter ( 1751):
E/flutter ( 1751):
E/flutter ( 1751): emit was called after an event handler completed normally.
E/flutter ( 1751): This is usually due to an unawaited future in an event handler.
E/flutter ( 1751): Please make sure to await all asynchronous operations with event handlers
E/flutter ( 1751): and use emit.isDone after asynchronous operations before calling emit() to
E/flutter ( 1751): ensure the event handler has not completed.
E/flutter ( 1751):
E/flutter ( 1751): **BAD**
E/flutter ( 1751): on<Event>((event, emit) {
E/flutter ( 1751): future.whenComplete(() => emit(...));
E/flutter ( 1751): });
E/flutter ( 1751):
E/flutter ( 1751): **GOOD**
E/flutter ( 1751): on<Event>((event, emit) async {
E/flutter ( 1751): await future.whenComplete(() => emit(...));
E/flutter ( 1751): });
E/flutter ( 1751):
E/flutter ( 1751): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:46:39)
E/flutter ( 1751): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
E/flutter ( 1751): #2 _Emitter.call
E/flutter ( 1751): #3 new LoginFormBloc.<anonymous closure>.<anonymous closure>
E/flutter ( 1751): <asynchronous suspension>
E/flutter ( 1751):
Reloaded 1 of 746 libraries in 1,055ms.
这是我的源代码:
login_form_event.dart
part of 'login_form_bloc.dart';
@freezed
class LoginFormEvent with _$LoginFormEvent {
const factory LoginFormEvent.emailChanged(String emailStr) = _EmailChanged;
const factory LoginFormEvent.passwordChanged(String passwordStr) =
_PasswordChanged;
const factory LoginFormEvent.loggedIn() = _LoggedIn;
}
login_form_state.dart
part of 'login_form_bloc.dart';
@freezed
class LoginFormState with _$LoginFormState {
const factory LoginFormState({
required EmailAddress emailAddress,
required Password password,
required bool isSubmitting,
required bool showErrorMessages,
required Option<Either<AuthFailure, TokenValue>> authFailureOrSuccessOption,
}) = _LoginFormState;
factory LoginFormState.initial() => LoginFormState(
emailAddress: EmailAddress(''),
password: Password(''),
isSubmitting: false,
showErrorMessages: false,
authFailureOrSuccessOption: none(),
);
}
login_form_bloc.dart
class LoginFormBloc extends Bloc<LoginFormEvent, LoginFormState> {
LoginFormBloc(this._getAuthInfo) : super(LoginFormState.initial()) {
on<LoginFormEvent>(
(event, emit) {
event.map(
emailChanged: (e) {
emit(
state.copyWith(
emailAddress: EmailAddress(e.emailStr),
authFailureOrSuccessOption: none(),
),
);
},
passwordChanged: (e) {
emit(
state.copyWith(
password: Password(e.passwordStr),
authFailureOrSuccessOption: none(),
),
);
},
loggedIn: (e) async {
final isEmailValid = state.emailAddress.value.isRight();
final isPasswordValid = state.password.value.isRight();
Either<AuthFailure, TokenValue>? loginFailureOrSuccess;
if (isEmailValid && isPasswordValid) {
emit(
state.copyWith(
isSubmitting: true,
authFailureOrSuccessOption: none(),
),
);
loginFailureOrSuccess = await _getAuthInfo(
Params(
emailAddress: state.emailAddress,
password: state.password,
),
);
}
//The error is pointed to this emit below
emit(
state.copyWith(
isSubmitting: false,
showErrorMessages: true,
authFailureOrSuccessOption: optionOf(loginFailureOrSuccess),
),
);
},
);
},
);
}
final GetAuthToken _getAuthInfo;
}
错误是在loggedIn事件处理程序内的第二次发出时指出的。
最佳答案
我所要做的就是添加一个 await
调用前的关键字event.map()
并用 async
标记函数如下所示。另外,我明确提到了我的个人事件处理程序应该返回什么。在这种情况下,它是 FutureOr<void>
.
class LoginFormBloc extends Bloc<LoginFormEvent, LoginFormState> {
LoginFormBloc(this._getAuthInfo) : super(LoginFormState.initial()) {
on<LoginFormEvent>(
(event, emit) async {
await event.map<FutureOr<void>>( // Added an await in this line
emailChanged: (e) {
emit(
state.copyWith(
emailAddress: EmailAddress(e.emailStr),
authFailureOrSuccessOption: none(),
),
);
},
passwordChanged: (e) {
emit(
state.copyWith(
password: Password(e.passwordStr),
authFailureOrSuccessOption: none(),
),
);
},
loggedIn: (e) async {
final isEmailValid = state.emailAddress.value.isRight();
final isPasswordValid = state.password.value.isRight();
Either<AuthFailure, TokenValue>? loginFailureOrSuccess;
if (isEmailValid && isPasswordValid) {
emit(
state.copyWith(
isSubmitting: true,
authFailureOrSuccessOption: none(),
),
);
loginFailureOrSuccess = await _getAuthInfo(
Params(
emailAddress: state.emailAddress,
password: state.password,
),
);
}
emit(
state.copyWith(
isSubmitting: false,
showErrorMessages: true,
authFailureOrSuccessOption: optionOf(loginFailureOrSuccess),
),
);
},
);
},
);
}
final GetAuthToken _getAuthInfo;
}
或者,我们也可以替换 map
使用 when
的方法在事件处理部分(我更喜欢在上面的场景中使用 map
)。然后,代码将如下所示:
class LoginFormBloc extends Bloc<LoginFormEvent, LoginFormState> {
LoginFormBloc(this._getAuthInfo) : super(LoginFormState.initial()) {
on<LoginFormEvent>(
(event, emit) async {
await event.when<FutureOr<void>>( // Replace map with when
emailChanged: (emailStr) { // Can directly pass String instead of _EmailChanged object
emit(
state.copyWith(
emailAddress: EmailAddress(emailStr), // Can directly pass emailStr as shown
authFailureOrSuccessOption: none(),
),
);
},
passwordChanged: (passwordStr) {
emit(
state.copyWith(
password: Password(passwordStr),
authFailureOrSuccessOption: none(),
),
);
},
loggedIn: () async {
final isEmailValid = state.emailAddress.value.isRight();
final isPasswordValid = state.password.value.isRight();
Either<AuthFailure, TokenValue>? loginFailureOrSuccess;
if (isEmailValid && isPasswordValid) {
emit(
state.copyWith(
isSubmitting: true,
authFailureOrSuccessOption: none(),
),
);
loginFailureOrSuccess = await _getAuthInfo(
Params(
emailAddress: state.emailAddress,
password: state.password,
),
);
}
emit(
state.copyWith(
isSubmitting: false,
showErrorMessages: true,
authFailureOrSuccessOption: optionOf(loginFailureOrSuccess),
),
);
},
);
},
);
}
final GetAuthToken _getAuthInfo;
}
注意:when
来自 freezed package .它不是 dart 语言的原生组件。
关于flutter_bloc(在事件处理程序正常完成后调用发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70231668/
所以,我正在使用 Django REST 框架创建我的 API 和所有内容。我想检查我是否可以从后端获得响应。所以,我能够得到回应。但是我在调试控制台上看到了一些问题。请帮我找出问题所在。这是我在
我在使用 flutter_bloc 在 Flutter 上实现应用程序时遇到问题.我理解核心概念,但我发现了一个“边缘情况”,其中没有示例或指南(至少我能找到): (我会简化问题)我有一个叫 Auth
我正在用BLoC模式在Flutter中重写一个非常简单的应用程序。但是,当我尝试在应用程序中使用BLoC组件时,出现错误。 我不知道该如何解决,如果有人知道,我将非常高兴! 当我尝试在BlocList
我正在使用 flutter_bloc 库来构建我的应用程序。除了 BlocProvider 之外,我还使用存储库提供程序,因为我将在整个应用程序中广泛使用特定的存储库。但我在上下文方面遇到了问题。以下
我正在尝试 Flutter,我在 github 上提出了许多项目,这些项目声明了存储库并将它们传递给 UI 端的 bloc。 为什么这是正确的做法,而不是在后端(在集团)? 例子: class MyA
BLoC 模式的实现有很多版本。其中之一是 Felix Angelov 的 flutter_bloc。 在其中一个社交媒体上,我看到了 flutter_bloc 的声明 对项目来说不是一个好的选择,应
我正在尝试创建一个 BLOC,它依赖于另外两个基于时间的 bloc 和一个非基于时间的 bloc。我所说的基于时间的意思是,例如,他们正在连接远程服务器,所以这需要时间。它的工作原理是这样的: 登录(
我正在使用flutter_bloc:^6.1.1以及依赖注入(inject)get_it:^5.0.6。当我向集团提交事件时,状态没有改变。 nav_bar_bloc.dart import 'dar
我正在使用 flutter_bloc 包来管理我的应用程序中的状态。我有一个用例,我必须从远程数据库加载初始状态。这要求 initialState 方法是异步的,但它不是。 如果不是通过使用 init
假设我有一个带有嵌套集合的 firestore 数据库。一所学校可以有不同的类(class),每门类(class)有不同的部分,每个部分有不同的页面。真的很简单。 从 Firestore 模式的角度来
我已经使用flutter_bloc创建了一个BLoC,在其中我可以收听流。当父窗口小部件(以及BLoC对象)被释放时,我想关闭流。 class ChatBloc extends Bloc { //
我有一个 tabview,我有流行的、最近的和即将到来的类别。他们在 api 上都有相同的响应。我正在尝试使用 flutter_bloc 从 api 获取数据。以前我使用 rxdart 主题,我为每种
假设我想在每次调用 Api 时检查互联网连接,如果没有互联网,调用会抛出异常,例如 NoInternetException,然后向用户显示一个状态屏幕,告诉他检查他们的连接。 如果不为 flutter
我是 Flutter 的新手,目前正在研究 DI。 我正在使用 flutter_bloc 和 provider 包。 flutter_bloc 附带一个 RepositoryProvider,我现在问
我是 Flutter 的新手,目前正在研究 DI。 我正在使用 flutter_bloc 和 provider 包。 flutter_bloc 附带一个 RepositoryProvider,我现在问
我最近在 youtube ( https://pub.dev/packages/flutter_bloc ) 上观看了 felix Angelov 的 flutter_bloc 包 (https://
我在 flutter 中遇到了附加的小部件测试问题。当我单独运行测试时,每个测试都成功了;但是,当我运行整个 main() 方法时,前三个测试成功,但后两个测试失败,并出现以下异常: Expected
为什么当我们需要使用带有 flutter_bloc 的 Equatable 类时? ,还有我们需要的 Prop 呢?这是在 flutter 中以块模式创建状态的示例代码,请我需要详细的答案。先感谢您
我正在Flutter中开始使用Bloc。任何人都可以告诉我什么是真正的“flutter_bloc”和“bloc”软件包。 是相同的。 何时/如何使用它。 谢谢 最佳答案 “bloc”包包含您将在Blo
我有一个 flutter 应用程序,在其中我在 listView 小部件中显示员工列表及其姓名和销售额。我为每个员工提供了两个按钮来增加或减少他们的销售额。 我正在使用flutter_bloc用于状态
我是一名优秀的程序员,十分优秀!