You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何让Getx Controller的onInit每次进入页面都执行?

解决Getx Controller每次进入页面触发onInit的问题

Getx默认通过Get.put()注册的控制器是单例模式,所以onInit只会在控制器首次初始化时执行一次。要实现每次进入页面都执行初始化逻辑,有以下几种可行方案:

方案一:页面销毁时删除控制器,下次进入重新初始化

在页面的dispose方法中主动删除控制器,同时注册时设置permanent: false,确保控制器不会被永久保留:

  1. 注册控制器时配置:
final yourController = Get.put(YourController(), permanent: false);
  1. 在页面的dispose方法中删除控制器:
@override
void dispose() {
  Get.delete<YourController>();
  super.dispose();
}

这样每次离开页面后控制器会被销毁,下次进入页面时会重新创建实例,触发onInit。

方案二:抽离初始化逻辑为单独方法,在页面生命周期调用

不依赖onInit,把数据加载逻辑抽成独立方法,在每次页面进入时主动调用:

  1. 修改控制器代码,抽离加载方法:
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);
  }
}
  1. 在页面的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:05:46