首页 > 解决方案 > 相当于 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]);
                    },
                  );

标签: flutterblocflutter-getx

解决方案


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;

这将显示暂停的小吃店。


推荐阅读