我有一个块,例如
PostsBloc
,它公开一个事件 LoadData
和一个事件 DeleteData
,并发出 LoadableBlocState<Post>
类型的状态(下面的类代码)
该块正在使用一个调用 http 端点的存储库来实现此目的。
如果删除调用得到响应 statusCode !== 200 我想向前端(脚手架)显示错误消息。我想显示“每次发生此错误时”
如果删除成功(statusCode 200),我想从数据中删除这篇文章,并在用户界面中显示成功消息。 如果我从帖子屏幕本身删除帖子(例如
post_screen.dart
已加载帖子 ID 3,然后想要返回弹出上下文。
我尝试了删除错误
拥有一个可以容纳“非致命”错误并监听它们的状态
import 'package:equatable/equatable.dart';
class LoadableBlocState<T> extends Equatable {
final bool loading;
final T? data;
final LoadableBlocError? error;
const LoadableBlocState._({
required this.loading,
required this.data,
required this.error,
});
const LoadableBlocState.initial()
: this._(
loading: false,
data: null,
error: null,
);
const LoadableBlocState.loading()
: this._(
loading: true,
data: null,
error: null,
);
const LoadableBlocState.loaded(T data)
: this._(
loading: false,
data: data,
error: null,
);
LoadableBlocState.errorLoading(Object error)
: this._(
loading: false,
data: null,
error: LoadableBlocError.withError(
action: LoadableBlocAction.fetch, error: error),
);
LoadableBlocState.otherError(
LoadableBlocState current, LoadableBlocError error)
: this._(
loading: current.loading,
data: current.data,
error: error,
);
bool isFetchFailed() =>
error != null && error!.action == LoadableBlocAction.fetch;
@override
List<Object?> get props => [this.loading, this.data, this.error, this.error];
}
class LoadableBlocError extends Equatable {
final LoadableBlocAction action;
final String? code;
final Object? error;
const LoadableBlocError._(
{required this.action, required this.code, required this.error});
const LoadableBlocError.withCode(
{required LoadableBlocAction action, required String code})
: this._(action: action, code: code, error: null);
const LoadableBlocError.withError(
{required LoadableBlocAction action, required Object error})
: this._(action: action, code: null, error: error);
@override
List<Object?> get props => [action, code, error];
}
enum LoadableBlocAction {
fetch,
delete,
create,
update,
}
我使用
听了发出上述类型状态的块使用集团反模式的成功方法:
我找不到尊重集团设计模式的正确解决方案。 我在下面发布了一些效果很好的解决方案
方法1
问题: 您认为在按照块的设计方式使用块的同时支持我的用例的最简洁的方法是什么?我无法在整个网络上找到使用块来实现如此简单的单一正确解决方案,想要监听删除/更新/插入错误并在每次发生时显示它们,而不仅仅是一次。
这看似简单,实则更复杂。另一个例子:您触发帖子 id 3 的帖子删除,然后打开帖子 1 的 post_screen。 您从帖子 ID 3 中收到错误,并在屏幕 1 中显示错误。可能还必须发送标识符。我尝试过,但 bloclistener 仅在连续错误时触发一次。
正如您所说,您的问题是第二个 TapOn 不会显示错误消息,解决方案是在用户单击按钮后立即将状态更改为加载或其他任何内容,然后开始删除过程,结果是错误或成功