flutter - 相当于 GetX 中的 BlocListener
问题描述
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]);
},
);
解决方案
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;
这将显示暂停的小吃店。
推荐阅读
- go - 如何输出读取为整数的数字的平方
- flutter - 如何摆脱appbar和body之间的界限?
- node.js - 在 fetch() 发出删除请求后重定向
- javascript - 想做一个这样的自定义轮播不知道这实际上叫什么?
- react-native - React Native:如何在地图上更新标记?
- reactjs - React on GitHub Pages refresh url not found
- windows - 在计算机目录中找到文件夹内的文件,即使被 cmd 隐藏
- google-apps-script - 如何通过 Google Apps 脚本在 MS Graph Api 中创建订阅
- jquery - FullCalendar:填充事件并单击按钮时,它会返回到当前月份 jquery
- rest - GraphQl 片段到 Pojo