GetX是基于ReactiveX思想的一款响应式状态管理框架,相比于BLoC,它有如下优势:
- 相比于BLoC,GetX的工程结构更简单,需要维护的文件更少;
- BLoC无法实现真正的跨页面数据状态管理(全局BLoC可部分实现,但维护起来较麻烦);
- 内部实现了路由管理,简单易用;
GetX插件的使用
1)在pubspec.yaml中引入getX库,执行flutter pub get;
2)在Android Studio → Prefrences → Plugins 中搜索 getX,选择并下载插件;
3)插件下载后,在工程中lib路径下新建 new → flutter bloc,插件会自动生成模版代码;
输入Module Name后点击OK,自动生成以下文件
logic层生成的默认代码
state层生成的默认代码
view层生成的默认代码
在GetX范式下,不再通过context传递状态管理器,而是通过put/find获取;
main.dart改造:将原MaterialApp替换为GetMaterialApp,使App能够拥有GetX的特性,GetMaterialApp内部的参数与MaterialApp相同;
GetX范式下逻辑的编写
需求:点击页面右下角的按钮,每点击一次,页面中间现实的数字+1;
1)UI基础布局
2)在state中声明需要管理状态的变量,并初始化
3)在logic中编写相应的计数逻辑,在状态修改后需要手动调用内置函数update()
4)回到view中,在button的点击事件中调用logic中的方法,并将需要监听状态的组件使用GetBuilder包裹
以上便完成了在GetX范式下,业务逻辑组件的编写;
GetX也提供了Easy模式,在Easy模式下,将原logic、state合并,整体结构为 logic - view,需要管理状态的变量和对应的逻辑均写在logic中,可用于数据交互简单的页面;
GetX响应式逻辑的编写
GetX也提供了响应式编程的范式,在响应式范式下,相较于标准的GetX范式,我们只需要进行少量的修改;
1)state:用Rx…来定义需要状态管理的的变量的类型,在变量初始化是,加上.obs后缀
2)logic:直接写状态变换(在这里是增加计数)的逻辑即可,无需调用update()
3)view:将需要监听状态的组件改用Obx包裹
以上便完成了GetX下响应式范式的逻辑编写;
GetX标准范式与响应式的对比:
- 标准范式是命令式编程,需要手动调用内置函数update();响应式则是配合Rx…变量使用,不需要手动调用其他函数;
- 每一个响应式变量都要创建一个GetStream,如果变量较多,或者长数据的场景,对内存消耗较大;
- 标准范式采用GetBuilder来包装组件,GetBuilder本质上也是一个Widget,对内存的影响极小;
综上个人推荐使用标准范式;
GetX跨页面交互
相比于BLoC,GetX提供了可以方便的跨页面传递数据的能力,我们先创建两个模块,get_demo_one、get_demo_two;
需求:页面one支持跳转到页面two,并传递数据到页面two,页面two内部实现点击计数的功能,在退出页面时,将计数同步至页面one;
1)编写get_demo_one_state,声明、初始化需要状态管理的变量
2)编写get_demo_one_logic,添加count计数和页面跳转的逻辑,Get.to…为GetX中的路由管理函数,在下面会讲到
3)编写get_demo_one_view的基础UI布局
4)编写get_demo_two_state,声明、初始化需要状态管理的变量
5)编写get_demo_two_logic,添加count计数和获取Page One传递过来的数据的逻辑
6)编写get_demo_two_view的基础UI布局,通过Get.find()函数获取最近一个被初始化的GetDemoOneLogic实例
以上便完成了GetX范式下,多页面间数据传递的逻辑;
GetX路由管理
简单路由
简单路由就是直接通过Get.to(SomePage())的方式跳转页面,上面例子中PageOne跳转到PageTwo使用的就是简单路由;
命名路由
- 通过统一配置管理所有页面
- 通过url方式跳转页面
1)编写配置文件RouteConfig.dart
2)配置主入口,此处应删掉home参数,因为home和initialRoute会同时初始化,不应该同时设置,这里只保留initialRoute;
3)使用路由
4)退出页面:无论使用简单路由,还是命名路由的方式,都是用Get.back()函数来退出当前页面;
GetX资源释放
在使用GetX进行路由管理时,有可能会出现资源未释放的问题;
资源未释放的场景:
- 使用了GetX范式构建工程,但使用Navigator.push()/Navigator.pop()方式做路由管理;
资源未释放的原因分析:
- GetxController内部有一套自己的内存管理机制,该机制会通过Get.to()/Get.toName()/Get.back()等方法来触发;
- 可以理解成,当调用Get.to()/Get.toName()时,GetX会将被导航页面内部创建的GetxController(logic)储存起来,然后再调用Get.back()时,将储存的GetxController(logic)释放掉;
- 因此,如果使用了Navigator.push()/Navigator.pop()方式做路由管理,GetX无法捕获到当前的GetxController(logic),在页面销毁时自然无法释放掉对应的GetxController(logic);
解决方案:
手动让GetX感知路由,重写页面在感知到push/pop之后的行为;
- reportCurrentRoute()方法是将传入的路由交给GetX来管理,继而可以通过GetX来管理路由中的GetxController;
- reportRouteDispose()方法是通过GetX将传入的路由释放掉;
- 基于以上修改,即使使用Navigator.push()/Navigator.pop()方式做路由管理的页面,依然可以被GetX获取到GetxController,从而完成资源释放;
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
全套视频资料:
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓