GetX:千万不要手动创建

  1. 手动创建的问题
  2. 亲身经历
    1. 生命周期不会触发

手动创建的问题

手动创建 = 脱离 GetX 容器 = 生命周期失效 + 状态管理失效 + 内存泄漏风险。

问题 说明 示例
生命周期不会触发 如果直接 var c = MyController();,不会触发 onInit() / onClose(),因为 GetX 没有接管它。 dart var c = MyController(); // onInit 不会执行
状态管理失效 ObxGetBuilder 无法正确监听这个控制器,因为它不在 GetX 的依赖树里。 页面 UI 不会刷新,即使 update() / Rx 触发了。
无法通过 Get.find() 获取 手动创建的对象没有注册到 GetX 容器,别的地方调用 Get.find<MyController>() 会报错。 dart Get.find<MyController>(); // Error
可能重复创建实例 每次 MyController() 都是新对象,数据状态丢失,不同页面拿到的不是同一个实例。 可能导致登录状态、计数器值丢失。
onClose 不会执行 因为 GetX 不知道这个控制器何时销毁,资源(如 Stream、Timer)可能一直占用内存。 内存泄漏风险。

亲身经历

生命周期不会触发

// 创建了 PostApi 
class PostApi extends GetConnect {
  @override
  void onInit() {
    httpClient.baseUrl = "https://jsonplaceholder.typicode.com";
    super.onInit();
  }

  Future<Response> getPosts() => get("/posts");
}

//  创建 Controller
class PostController extends GetxController with StateMixin<List<dynamic>> {
  // 在这里手动创建 PostApi, 脱离 GetX 容器
  final PostApi api = PostApi();

  void fetchPosts() async {
    // 发送请求,发生报错
  	final response = await api.getPosts();
    
  }
}

报的错误:ArgumentError (Invalid argument(s): No host specified in URI /posts)

说明 请求地址缺少 host,也就是 GetConnect 没有正确拼接 baseUrl + /posts

因为PostApi api是手动创建的,所有不会去执行onInit方法,就不会有baseUrl

×

喜欢就点赞,疼爱就打赏