flutter getx(Flutter状态管理--GetX的简单使用)
本文目录
- Flutter状态管理--GetX的简单使用
- getx的controller是怎么销毁的
- flutter 使用Getx提示错误
- GetX实践 2022-05-18 周三
- Flutter遇到的坑
- flutter 完全使用GetX 主题切换 以及 自创建Widget的颜色随主题变化方案
Flutter状态管理--GetX的简单使用
一、前言 Flutter开发,就需要对各种状态的管理,就是在请求数据的时候需要实时变化,各种交互变化等,在没有使用GetX之前使用Provider,用Provider的时候觉得真香,挺方便的,需要刷新的时候直接 notifyListeners(); 用了GetX之后觉得Provider太繁琐了。这边介绍下GetX的使用以及常用的方法。 二、 GetX GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入和便捷的路由管理。 1、相关优势: 三、使用 1、第一步 引入get 2、第二步 修改入口、配置路由 3、路由 Routes类 Pages类 4、状态管理 我一般一个page对应一个controller, controller来处理逻辑,控制page. 简单使用 5、依赖注入 依赖注入也是我喜欢的,可以减少很多工作。 第一步 第二步 6、跨页面交互 7、黑暗模式 可以参考前期写的博客。 黑暗模式的适配
getx的controller是怎么销毁的
getx可以做到通过页面的退出自动控制controller的销毁,那么他是怎么做到的呢
当我们使用getx的路由套件时,可以看到,他的每个跳转方法都使用了自定义的 GetPageRoute 。 在 GetPageRoute 中对于此次的问题,我们需要关注的是两个方法
嗯,这里给传了一个 reference 给了 Get.reference ,这个 reference 看一下是什么玩意。。
dispose ,route退出流程里调用的方法。在这里面Get做了两件事,我们主要关注第一件事, removeDependencyByRoute() 参数是上面的页面标识。
这个方法里,我们可以看到调用了 GetInstance 的 delete 方法,这个方法就是销毁controller的方法,但是为什么呢?为啥传一个页面标识就能删除到对应的controller呢。我们接着看
我们都知道我们在使用getx的controller时,一定会有两个操作,一个是 Get.put() ,一个是 Get.find() 让我们一个一个的看一下
Get.put 的本质其实是将我们传入的实例,根据类 S 和 tag 创建一个 key ,然后以key和实例作为键值对存入了全局的map中(此处是简单理解,看也看得出来不是直接传实例了)
Get.find 方法很简单的只是通过类 S 和 tag 去全局map中找一个实例返回出去, 但是 返回之前,还做了一步操作,即 _initDependencies 。
看到没,就在下面Get.reference,之前在GetPageRoute的页面构建之前赋值了最近的页面,然后在此处用来做routesKey的value和前面的controller的key值进行绑定。
这也是得益于flutter是个单线程模型,才能这样无脑的通过这种方式传值。其实getx中有不少让人觉得神奇的地方都是利用了单线程的优势,比如Obx的自动刷新,也是在Obx的build方法和Rx的value的get方法之间通过一个全局指针来进行传值。
flutter 使用Getx提示错误
新手最近在使用Getx做状态管理, 在使用中遇到问题, 随手记录下, 提示错误: GET the improper use of a getx has been detected you should only use getx or obx for the specific widget that will be updated. if you are seeing this error, you probabaly did not insert any observable variables into GetX/Obx... 其实提示很明显, 就是Obx()中组件没用到controller内容, 比如Obx(()=》Text("123")), 这里面Obx没有用到GetxController的对象, 就会报这个错误,如果改成Obx(()=》Text(controller.content)), 就可以了
GetX实践 2022-05-18 周三
GetX是一个状态管理框架,可以替代Bloc,fish_redux,fluro等框架,性价比很高。 pubspec.yaml中添加一行 一个页面,本来只需要一个有状态或者无状态widget。使用Getx之后,可以分为state,logic,view三个不同的文件,各司其职。 这个可以理解为状态管理,相当于MVC中的Model层,是专门用来管理数据的。 逻辑层,相当于MVC中的Controller,处理业务逻辑 视图层,相当于MVC中的View,进行显示。 这个和原来的widget基本上差不多。 大佬手把手教你优雅地进行Flutter开发(GetX值得一试)
Flutter遇到的坑
最近写了一个LoadingView用于页面的网络加载,使用的是StatefulWidget。由于项目是使用的Get对状态进行控制的,所以在GetBuild中对Loading进行刷新。但在使用中发现rebuild LoadingView没有刷新状态,看参数是在Widget中更新了的。 后续定位发现,StatefulWidget在rebuild的时候,并不会重新执行initState方法,而只会执行build方法,这也符合state和widget的一对多原则。知道问题所在,修改也非常简单。去掉state中的status变量,使用widget中的initStatus值即可。 在此记录,对于Get的一些注意点。 目前项目中对Widget进行了内嵌LoadingView的BaseWidget封装,对GetxController进行了LoadingStatus状态操作的BaseController封装。发现在第二个继承了BaseWidget的页面中,对绑定的Controller进行update操作无效。 阅读源码后发现,GetBuilder的global参数默认是true,在没有指定tag的情况下,会根据controller作为key进行全局map,若第二次调用时,会先通过Controller进行get,正好我们的BaseWidget使用的是BaseController导致全局只有一个Controller从而导致第二个页面无法刷新问题。我们只需要在基类中将global改为false,直接使用init的controller即可。 目前在做App的主题色切换功能,发现在部分主题色下,Appbar的标题和Action自动变成深色,查阅资料后得知,由于色值的computeLuminance值过大导致Brightness自动为Brightness.light。 知道原因后就好办了,通过设置ThemeData里面的Brightness类型的参数为Brightness.dark(注意我们只需要Appbar为深色,brightness参数控制的是整个页面,不修改)。经验证,primaryColorBrightness控制Appbar的标题和action,修改即可。
flutter 完全使用GetX 主题切换 以及 自创建Widget的颜色随主题变化方案
这篇将会解决手动切换主题以及跟随手机切换主题来更新UI(包括自己创建的Widget) 主题切换有个问题,就是如果是我们自定义或者在 build() 自己创建的部件是不会随着系统的主题切换而发生主题色变化的(实际测试中,如果页面在顶层(没有被push)切换主题并不会触发 build() 方法,(push之后的页面切换系统主题是可以触发 build() 的,而且会频繁触发好多次...),既然无法通过重新 build 更新组件的主题色,那么我们在切换主题后,强制触发整个app的 build() 就可以了)
更多文章:
下载internet explorer(在哪里可以官方下载internet explorer,哪个版本的ie最好)
2023年6月18日 08:40
安徽基础教育资源平台(安徽基础教育资源应用平台,我登陆密码忘记了咋办)
2024年6月30日 13:59
仙剑奇侠传五手游攻略(仙剑奇侠传五攻略_就问战侠有多强《仙剑奇侠传五》战侠攻略)
2024年8月29日 10:35
apple id密码要求(Apple ID的密码要怎么设置啊求格式)
2024年3月22日 03:00