相当于 GetX 中的 BlocListener

the equivalent of BlocListener in GetX

在 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;

这将显示暂停的小吃店。