是否有与 Getx 中的 BlockListener 等效的功能,例如根据状态显示小吃栏...就像 Bloc 模式中的这个示例
body: BlocConsumer<PhotoBloc, PhotosState>(
listener: (context, state) {
if(state is PhotoErrorState) {
return ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(state.message))
);
}
},
builder: (context, state) {
if (state is PhotoLoadingState) {
return Center(child: CircularProgressIndicator(),);
} else if (state is PhotoLoadedSuccessfullyState) {
return Card(
child: ListView.builder(
itemCount: state.photos.length,
itemBuilder: (context, i) {
return ListTile(
leading: CircleAvatar(child: Image.network(state.photos[i]
.url),),
title: Text(state.photos[i].title),
onTap: () {
context.read<NavigationCubit>().showPhotoDetails(state.photos[i]);
},
);
答案 0 :(得分:1)
Workers 是侦听任何可观察对象的 Getx 方式。 ever
函数会在可观察对象发生变化时被调用。
假设你真的想让它感觉像 bloc
并且你想设置一个可观察的枚举,所以它类似于 state.whateverState...
您可以通过在控制器的 onInit
中设置侦听器来执行以下操作:
enum Status { none, running, stopped, paused }
class Controller extends GetxController {
Rx<Status> status = Status.none.obs;
@override
void onInit() {
super.onInit();
ever(
status,
(value) {
if (value == Status.running) {
Get.snackbar('State Updated', 'Running');
}
if (value == Status.none) {
Get.snackbar('State Updated', 'None');
}
if (value == Status.stopped) {
Get.snackbar('State Updated', 'Stopped');
}
if (value == Status.paused) {
Get.snackbar('State Updated', 'Paused');
}
},
);
}
}
然后,您可以从应用程序的任何位置执行以下操作:
Get.find<Controller>().status.value = Status.paused;
这将显示暂停的小吃店。