如何在返回到指定屏幕前调用所需方法
解决方案
方案1:全局可监听的数据库事件总线
- 实现一个全局单例的事件总线,不需要依赖GetX上下文,后台推送、数据库操作都可以向这个总线发送数据变更事件,对应页面的Controller监听事件即可触发重新查询。
示例代码:
// 全局单例事件总线 final dbEventBus = EventBus(); // 定义对应表的数据变更事件类 class UserDataChangedEvent {} // 后台推送收到新数据后更新数据库,同时发送事件 void handlePushNotification(Map data) async { await db.insert('user', data); dbEventBus.fire(UserDataChangedEvent()); } // 页面Controller里监听事件 class UserController extends GetxController { late StreamSubscription eventSub; final userList = <User>[].obs; @override void onInit() { super.onInit(); // 页面初始化先查询一次数据 queryUserList(); // 监听数据变更事件自动刷新 eventSub = dbEventBus.on<UserDataChangedEvent>().listen((_) { queryUserList(); }); } Future<void> queryUserList() async { final res = await db.query('user'); userList.value = res.map((e) => User.fromJson(e)).toList(); } @override void onClose() { eventSub.cancel(); super.onClose(); } }
方案2:封装导航方法统一触发前置查询
- 把
Get.back()、Get.off()这类导航操作封装成全局统一的工具方法,在内部统一判断是否需要触发数据查询逻辑,不需要每个页面单独处理。
示例代码:
class NavUtils { static Future<T?> back<T>({bool needRefresh = true}) async { if (needRefresh) { // 可以直接触发全局页面刷新事件,也可以根据当前路由匹配对应页面的查询方法 dbEventBus.fire(PageRefreshEvent()); } return Get.back<T>(); } static Future<T?> off<T>(String routeName, {bool needRefresh = true}) async { if (needRefresh) { dbEventBus.fire(PageRefreshEvent()); } return Get.offNamed<T>(routeName); } }
方案3:本地数据库触发器+变更监听
如果用的是支持变更监听的本地数据库(比如Drift、Isar、sqflite扩展库),可以直接监听对应表的变更事件,不管是页面操作还是后台推送触发的数据库变更,都能自动收到通知刷新数据,完全不需要手动调用查询方法。
以Isar为例:
// Controller里直接监听表变更自动刷新 final userSub = Isar.instance.users.watchLazy().listen((_) { queryUserList(); });
以上三种方案可以组合使用:事件总线解决跨上下文的状态通知问题,适配后台推送场景;封装导航方法统一处理路由跳转前的刷新逻辑;数据库自带的监听能力可以减少大量手动触发查询的重复代码。
内容的提问来源于stack exchange,提问作者ccd
相关产品推荐
相关产品推荐

