Getx状态管理
最近学习了Getx,尝试使用Getx搭建Flutter项目架构,感觉真好用、真香;Getx天然的可以将界面、逻辑、依赖和路由完全解耦,用起来更清爽,逻辑更清晰,代码容易维护;
学习一个框架不单单看看文档怎么使用,更重要的是看源码学习作者的整个设计思路、设计模式等来解决心中的疑惑;
Flutter状态管理--Getx学习1--Obx,分析了Obx怎么通过数据改变自动UI的刷新的,熟悉了整个设计流程,下面Getx中提供的widget就很简单了;
GetView
abstract class GetView<T> extends StatelessWidget {
const GetView({Key key}) : super(key: key);
final String tag = null;
T get controller => GetInstance().find<T>(tag: tag);
@override
Widget build(BuildContext context);
}
Stateless的Widget,很简单,很有用
- 前提是controller已注册了;
- 使用命名路由binging依赖注入后的路由,直接继承GetView
- 已经确定依赖已经初始化完成的,需要使用controller的widget 例如
/// 命名路由
GetPage(
name: AppRoutes.SPLASH,
page: () => SplashPage(),
binding: BindingsBuilder.put(() => Get.put(SplashController())),
),
/// 闪屏界面
class SplashPage extends GetView<SplashController> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Image.asset(
R.LOGO_SPLASH_ID,
width: double.infinity,
height: double.infinity,
fit: BoxFit.cover,
));
}
}
GetBuilder
- GetBuilder相比Obx,GetBuilder是手动的状态管理器,需要更改的时候主动需要调用update();
- 因为GetBuilder是手动的状态管理器,所以相比Obx,内部没有维护StreamSubscription,内存消耗就会少
GetBuilder 源码还是很好理解的,点进去看下,就简单介绍下怎么使用
/// 必创参数,回调返回子widget
final GetControllerBuilder<T> builder;
/// 默认是true; 如果Controller已经注册,如果是已懒加载的方式注册的,GetBuilder移除的时候删除
/// 删除controller,如果没有注册调用init初始化,GetBuilder移除的时候删除也删除controller
/// 设置false,调用init初始化,GetBuilder移除的时候删除也删除controller
final bool global;
/// 这个id很有用,如果同一个controller,被多个GetBuilder关联,当需要赛选其中一个刷新时候
/// 调用 update(['id']);
final Object id;
/// 同一个类型有多个不同的实例时,tag区分;唯一
final String tag;
/// 默认true,时候自动回收controller
final bool autoRemove;
/// 默认false 控制当GetBuilder移除的时候是否删除内存中的controller
final bool assignId;
/// 过滤器,控制刷新时机
final Object Function(T value) filter;
/// 对应state生命周期的回调
final void Function(State state) initState, dispose, didChangeDependencies;
final void Function(GetBuilder oldWidget, State state) didUpdateWidget;
/// 当controller没有注册的时候,初始化
final T init;
GetX
- Getx相比GetBuilder实现了自动响应数据变化,
- Getx相比Obx,内部可以初始化controller,以及state生命周期的回调,controller时候及时回收等;
- Getx相比GetBuilder、Obx效率要低,
MixinBuilder
- 看名字就知道融合Obx、GetBuilder功能
- 既可以手动控制刷新,也可以自动刷新;
- 内存消耗最多的,效率最低的 Getx还提供很多局部刷新的weidget ValueBuilder 、ObxValue等,都很简单,
这里有个很实用的技巧,例如
ObxValue((data) => Switch(
value: data.value,
onChanged: data, // Rx 有一个 _callable_函数! 你可以使用 (flag) => data.value = flag,
),
false.obs,
),
/// 响应数据data,data();会调用call()方法,自动赋值,自动刷新
T call([T v]) {
if (v != null) {
value = v;
}
return value;
}