Flutter中GetX的debounce未执行问题排查与解决求助
问题原因与解决方案
你的debounce代码块不执行的核心原因有两个:
- 监听对象错误:你当前用
debounce监听的是_count这个Observable变量,但在updateIndex方法里从未修改过_count.value,变量值始终为0没有变化,debounce的触发条件(监听变量变更)从未满足。 - 注册时机错误:每次调用
updateIndex都重新创建一个debounce实例,这不仅冗余,还会导致监听逻辑混乱。
修正步骤
直接修改MainController代码,将debounce监听目标改为实际会变化的selectIndex,并在控制器初始化时仅注册一次监听:
import 'package:get/get.dart'; class MainController extends GetxController { var selectIndex = 0.obs; @override void onInit() { super.onInit(); // 控制器初始化时注册debounce,仅执行一次 debounce( selectIndex, (value) { print("debounce -> " + value.toString()); }, time: const Duration(seconds: 2), ); } void updateIndex(int index) { selectIndex.value = index; // 若使用GetBuilder,可保留update();若改用Obx响应式UI,可删除此句 // update(); } }
额外优化(可选)
如果你想更贴合GetX的响应式特性,可将页面中的GetBuilder替换为Obx,无需手动调用update():
修改MyHomePage代码:
class MyHomePage extends StatelessWidget { // 提前将控制器注入GetX依赖树 final MainController controller = Get.put(MainController()); @override Widget build(BuildContext context) { return Scaffold( body: const Text("ddddd"), bottomNavigationBar: Obx(() => BottomNavigationBar( items: const [ BottomNavigationBarItem(icon: Icon(Icons.home), label: "a"), BottomNavigationBarItem(icon: Icon(Icons.subscriptions), label: "b"), BottomNavigationBarItem(icon: Icon(Icons.rss_feed), label: "c"), BottomNavigationBarItem(icon: Icon(Icons.school), label: "d"), ], currentIndex: controller.selectIndex.value, fixedColor: Theme.of(context).primaryColor, onTap: controller.updateIndex, unselectedItemColor: const Color(0xff666666), type: BottomNavigationBarType.fixed, )), ); } }
这样修改后,当你点击底部导航栏切换索引时,debounce会在最后一次点击的2秒后执行打印逻辑,符合预期。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

