Flutter中如何让Getx Controller的onInit每次进入页面都执行?
解决Getx Controller每次进入页面触发onInit的问题
Getx默认通过Get.put()注册的控制器是单例模式,所以onInit只会在控制器首次初始化时执行一次。要实现每次进入页面都执行初始化逻辑,有以下几种可行方案:
方案一:页面销毁时删除控制器,下次进入重新初始化
在页面的dispose方法中主动删除控制器,同时注册时设置permanent: false,确保控制器不会被永久保留:
- 注册控制器时配置:
final yourController = Get.put(YourController(), permanent: false);
- 在页面的
dispose方法中删除控制器:
@override void dispose() { Get.delete<YourController>(); super.dispose(); }
这样每次离开页面后控制器会被销毁,下次进入页面时会重新创建实例,触发onInit。
方案二:抽离初始化逻辑为单独方法,在页面生命周期调用
不依赖onInit,把数据加载逻辑抽成独立方法,在每次页面进入时主动调用:
- 修改控制器代码,抽离加载方法:
class YourController extends GetxController { RxString name = '-1'.obs; RxString avatarImage = '-1'.obs; String username = '-1'; File? file; @override Future<void> onInit() async { super.onInit(); await loadUserData(); // 首次进入执行 } // 独立的用户数据加载方法 Future<void> loadUserData() async { SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); name.value = sharedPreferences.getString('name') ?? '-1'; avatarImage.value = sharedPreferences.getString('imageAddress') ?? '-1'; username = sharedPreferences.getString('username') ?? '-1'; file = File(avatarImage.value); } }
- 在页面的
initState中调用该方法(适用于StatefulWidget):
@override void initState() { super.initState(); // 页面渲染完成后执行加载 WidgetsBinding.instance.addPostFrameCallback((_) { Get.find<YourController>().loadUserData(); }); }
如果是使用GetView的无状态页面,可以在build方法中添加回调执行。
方案三:使用Get.create创建非单例控制器
使用Get.create()替代Get.put(),每次获取控制器都会创建新的实例,自然每次都会执行onInit:
final yourController = Get.create(() => YourController());
注意:这种方式下控制器是临时实例,多个地方获取会得到不同的对象,适合不需要跨页面共享状态的场景。
选择哪种方案取决于你的业务需求:如果需要保留控制器状态,优先方案二;如果不需要状态,方案一或三都可以。
内容的提问来源于stack exchange,提问作者sadegh
相关产品推荐
相关产品推荐

