问题描述
我正在尝试实现 bloc 模式,其中我使用了一个存储库类,该类包含使用 API 进行调用的所有方法。另一方面,我正在实现 BlocBuilder 以根据 bloc 状态呈现视图,但是我收到此错误 BlocBuilder
我真的不确定问题来自哪里。这是代码的一些片段。
这是导致错误的块类
*.firebaseapp.com
}
这是实现 Bloc Builder 的 Statefull 小部件
class VehiclesBloc extends Bloc<VehiclesEvent,Vehiclesstate>{
VehiclesBloc(Vehiclesstate initialState) : super(initialState);
@override
Stream<Vehiclesstate> mapEventToState(VehiclesEvent event) async* {
// Todo: implement mapEventToState
if(event is LoadVehiclesList){
yield* mapLoadEventToState(event);
}
}
Stream<Vehiclesstate> mapLoadEventToState(LoadVehiclesList event) async* {
if(event is LoadVehiclesList){
var response = await VehiclesService().getAll();
if(response.IsSuccess){
yield VehiclesLoaded(response.Data);
}else{
yield VehiclesLoadingFailed(response.ErrorList.toString());
}
}else{
yield VehiclesLoading();
}
}
解决方法
我认为这个代码部分导致了问题:
return Center(
child: LoadingDialog.showLoadingDialog(context,text: ""),);
可能,LoadingDialog.showLoadingDialog
不返回 Widget 而只是一个返回 Future 的函数。
对于副作用(例如,您想显示对话框),您应该使用侦听器而不是在构建方法中执行此类代码。而不是 BlocBuilder
,只需使用 BlocConsumer
并添加侦听器:
BlocBuilder<VehiclesBloc,VehiclesState>(
listener: (context,state) {
if (state is {your loading state}) {
LoadingDialog.showLoadingDialog(context,text: "");
}
},builder: ...,),
关于您的代码的更多见解:
- 不要在有状态小部件中创建 BLoC 作为变量,而是使用 BlocProvider 来处理 BLoC 的一部分。
- 在加载数据之前产生
VehiclesLoading
状态,而不仅仅是作为“其他”情况。这样您就可以在您的 UI 中轻松处理加载行为。 要解决上述问题,只需按照文档操作:https://bloclibrary.dev/