Flutter状态管理--Getx学习2

2,984 阅读3分钟

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;
  }