# getx_controller_lifecycle **Repository Path**: lucifer_c/getx_controller_lifecycle ## Basic Information - **Project Name**: getx_controller_lifecycle - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-06 - **Last Updated**: 2023-11-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Flutter Gex框架GetXController生命周期探索 本项目是针对Getx框架在状态管理方面的探索,在各个子文件夹中的page类(下方的dart文件)头部都有在注释中做了对特定场景的说明,可在debug模式下运行代码,通过观察控制台的打印结果进行对比; - no_put_page.dart - life_cycle_page.dart - permanent_page.dart - put_same_class_page.dart ## 一、Getx在状态管理上为我们做了什么: 两种方式: 1. Obx:为我们提供了一种快速构建StreamBuilder的方式来监听属性的变化;可尝试:.a.listen()[假设a为.obs的属性] 2. GetBuilder:为我们提供了一种快速构建StreamBuilder的方式来监听属性的变化; ## 二、GetxController在使用前是不是必须先调用Get.put()? GetxController不是必须调用Get.put才能使用的: 1. .obs Obx() 这种方式不需要调用Get.put, 原因:obs的方式,Get帮我们构造StremBuilder,这个并不依赖Get底层维护的Map字典 2. GetBuilder在使用前需要调用Get.put,GetBuilder构造StatefulWidget在build的时候会通过GetInstance.find查找_singl这个map,没有调用put会找不到controller ## 三、初探GetxController的生命周期 1. GetX虽然各个功能均可单独引用使用,但是状态管理和路由是搭配的,如果没有使用 route_manager 组件(Get.to()或Get.toName()),那么状态管理的生命周期就会失效。put的Controller在不使用的时候不会再被删除,会变成了应用状态常驻内存里。 2. Get底层维护了一个Map用来保存GetxController实例,Key是类名+tag,当controller所在的Widget加入Widget树后(比如帮我们构建的StatefulWidget调用initStata后),会被put进Map,调用onInit,当controller所在的Widget退出路由后,会从Map删除,调用onClose 3. 调用完Get.put()且所在Widget加入Widget树后,才会调用onInit,onClose等生命周期函数 4. 正常加入的Widget的GetxController的生命周期是和Get路由绑定在一起的,这里说的生命周期是指controller实例是否在底层的Map中,和controller实例自身并无关,可以查看这篇文章:[《getx的controller是怎么销毁的》](https://www.jianshu.com/p/a643a1f6074e) 5. Get.put设定为全局变量时,只有在widget中被调用了,Get.put才是真正生效,否则Get.find会查找不到 6. 在Get.put的方法中设置permanent=true能避免controller随页面退出而销毁 7. GexController所在Widget只认准在生效前最后一次的Get.put() 8. 退出页面后销毁GexController存在延迟问题,快速退出页面再进入,可能会导致新的controller实例无法正常执行Get.put ## 四、在没有特别配置参数的情况下,Get.put是不能往底层的Map中加入同一个类的不同实例的,Get.to也不能跳转同一个路由名的页面, 1. Get.put可以用tag参数区分同一个类的controller实例,底层时通过routeName+tag作为key存储controller的 2. Get.to配置preventDuplicates: false 去除防止重复的限制,以达到跳转同Class(路由名称)的页面,场景例如:产品详情页1跳转产品详情页2