手动创建的问题
手动创建 = 脱离 GetX 容器 = 生命周期失效 + 状态管理失效 + 内存泄漏风险。
问题 | 说明 | 示例 |
---|---|---|
生命周期不会触发 | 如果直接 var c = MyController(); ,不会触发 onInit() / onClose() ,因为 GetX 没有接管它。 |
dart var c = MyController(); // onInit 不会执行 |
状态管理失效 | Obx 、GetBuilder 无法正确监听这个控制器,因为它不在 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
。