首页/文章/flutter

Flutter 全能型选手GetX —— 状态管理_getx obs

2023-07-28
13625 分钟
...

使用篇

原理篇

一、简介

  • Obx:响应式状态管理,当数据源变化时,将自动执行刷新组件的方法
  • GetX:响应式状态管理,当数据源变化时,将自动执行刷新组件的方法
  • GetBuilder:简单状态管理,当数据源变化时,需要手动执行刷新组件的方法,此状态管理器内部实际上是对StatefulWidget的封装,占用资源极少!

二、GetBuilder

我们在controller获取数据之后,就会调用controller的update方法来更新界面。如果我们需要刷新对应的界面,就可以 使用GetBuilder将需要Builder的页面包起来如下:

GetBuilder<FirstController>(builder: (controller) {
  return Text('第一页');
})

在controller里如果直接update的话,默认刷新全部,但是如果我们只想刷新部分界面,可以直接在 GetBuilder的参数加个标识Id,然后和update里方法里的参数id相对应就行了。

class FirstController extends GetxController {
  int count = 0;

  updateData() {
    update(['first']);
  }
}

GetBuilder<FirstController>(
  builder: (controller) {
    return Text('第一页');
  },
  id: 'first',
)

三、ValueBuilder

简化它的工作原理是使用采用更新值的回调。StatefulWidget.setState

ValueBuilder<bool>(
  initialValue: false,
  builder: (value, updateFn) => Switch(
    value: value,
    onChanged: updateFn, // same signature! you could use ( newValue ) => updateFn( newValue )
  ),
  // if you need to call something outside the builder method.
  onUpdate: (value) => print("Value updated: $value"),
  onDispose: () => print("Widget unmounted"),
),

四、Getx、Obx和ObxValue

与ValueBuilder类似,但这是Reactive版本,您传递一个Rx实例(还记得神奇的.obs吗?)并自动更新…是不是很棒? obs是Getx提供的一个用来修饰变量的。被obs修饰过的变量,可以不使用GetBuilder,但是需要使用另一个widget,那就是obx,来包裹需要刷新的widget,不需要我们手动去update。

Obx(() => Text('第一页:${controller.count}')))

  class FirstController extends GetxController {
  Rx<int> count = 0.obs;

  updateData() {
    // update(['first']);
    count.value++;
  }
}

另外一种形式的写法ObxValue 如下:

ObxValue(() => Text('第一页:${controller.count}'),count.obs)

当然Getx还提供了一个响应式的widget就是Getx,它和Obx都是响应式widget不需要手动update。

class SimplePage extends StatelessWidget {
  const SimplePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    Get.put(SimpleController());
    return GetX<SimpleController>(builder: (controller) {
      return Scaffold(
        appBar: AppBar(title: const Text('Simple')),
        body: GestureDetector(
          onTap: () {
            controller.increment();
          },
          child: Center(
            child: Text('${controller.counter.value}'),
          ),
        ),
      );
    });
  }
}

class SimpleController extends GetxController {
  Rx<int> counter = 0.obs;

  void increment() {
    counter.value++;
  }
}

![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
class GetX<T extends DisposableInterface> extends StatefulWidget {
  final GetXControllerBuilder<T> builder;
  final bool global;

  // final Stream Function(T) stream;
  // final StreamController Function(T) streamController;
  final bool autoRemove;
  final bool assignId;
  final void Function(GetXState<T> state)? initState,
  dispose,
  didChangeDependencies;
  final void Function(GetX oldWidget, GetXState<T> state)? didUpdateWidget;
  final T? init;
  final String? tag;

  const GetX({
    this.tag,
    required this.builder,
    this.global = true,
    this.autoRemove = true,
    this.initState,
    this.assignId = false,
    //  this.stream,
    this.dispose,
    this.didChangeDependencies,
    this.didUpdateWidget,
    this.init,
    // this.streamController
  });

  ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

当然要说Obx和Getx的区别的话,它提供参数比较多些,其中就包括了一下widget的生命周期。 如果我们想在widget生命周期做一些事,我觉得就可以 使用这个widget了。

五、GetView

GetX 提供了一个快捷的 Widget 用来访问容器中的 controller,即 GetView。GetView是一个继承 StatelessWidget的抽象类, GetView 是一个const Stateless的Widget,如果我们只有单个控制器作为依赖项,那我们就可以使用GetView,而不是使用StatelessWidget,并且避免了写Get.Find()。 可以看到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);
}

然后控制器的注册要写在bindings中,可以看这里 Flutter 全能型选手GetX —— 依赖管理

六、GetWidget

GetWidget不是个const Stateless视图,它缓存了一个控制器。由于缓存,不能成为一个 “const Stateless”(因为缓存,所以不能成为一个const Stateless)。当我们使用Get.create(()=>Controller())会在每次调用时生成一个新的Controlle,Get.find()` 因为我们平时一般不需要缓存控制器,所以一般很少使用。

七、总结

一般来说,对于大多数场景都是可以使用响应式变量。但是每个响应式变量(.obs),都需要生成对应的 Stream,如果对象足够多,将生成大量的 Stream,必将对内存造成较大的压力,该情况下,就要考虑使用简单状态管理了

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
flutter2026-07-01
Dart 入门回顾
1\. Dart 是什么 Dart 是一门类型安全、支持面向对象、支持异步编程的语言。它的语法和 JavaScript、TypeScript、Java、C# 都有一些相似之处。 Dart 常见使用场景: Flutter 跨平台应用开发 命令行工具 Web 应用 服务端接口或脚本 作为学习现代类型语言的入口 Dart 的几个核心特点: 静态类型:变量、函数返回值、参数都有类型。 类型推断:很多时候可以用 ,让 Dart 自动推断类型。 空...
学习
flutter2026-07-01
Flutter 常用 Widget 入门
Flutter 的核心思想是:一切皆 Widget。文字、图片、按钮、页面结构、布局、间距、滚动、动画、手势,几乎都由 Widget 组合出来。 1\. Widget 先分成几类理解 | 类别 | 常用 Widget | 解决什么问题 | | | | | | 应用入口 | 、 | 搭建应用外壳、主题、路由 | | 页面骨架 | 、 、 | 标准页面结构 | | 基础显示 | 、 、 | 显示文字、图标、图片 | | 布局容器 | 、 、...
学习
flutter2024-11-21
在 Flutter 中使用 webview_flutter 4.0
1. 2. ,已入选 3. 4. 本文是第 4 篇,定位是新手入门,介绍和演示 webview 的基础用法。最后还介绍了事件处理的技巧。因为是补写的,所以本来应该首发的却发在最后了。 环境准备已经在 说过了,不再赘述。既然是新手入门,就会本着详尽的原则,而且会多配示例。 获取页面信息 获取页面 title 核心方法:controller.getTitle 完整示例,放在 main.dart 就能运行。运行示例,点击获取 title 的按...
学习
flutter2024-11-06
flutter android端运行报错Namespace not specified. Specify a namespace in the module‘s build file
在使用flutterSDK 3.24之后发现新建项目,项目默认都是基于AGP8了,由于 AGP 开始强制要求 namespace 配置,不仅仅是主工程,也包括第三方库都强制要求 namespace 。但是我们在引入第三方库的时候会发现部分库没能及时的去做相关配置,这也就导致了我们会出现标题错误: 出现这个问题,我们可能会通过去找到本地缓存的第三方库代码去修改它的build.gradle和AndroidManifest.xml来解决缺失...
学习
flutter2024-11-03
Flutter中如何实现APP升级功能背景
背景 每个App应用中一定会包含的功能 ,App的运行平台不同实现升级功能的方式也就不同,基本分类如下所示。本文主要聚焦在使用Flutter框架开发的应用在安卓系统内如何更新,以及所涉及要点梳理。 IOS系统 Andriod系统 官网下载 各类应用市场 (本文聚焦点) 功能清单(按步骤) UpgradeCard组件(展示升级内容) 进行新旧版本对比判断是否需要更新 下载更新然后安装应用 UpgradeCard组件 组件需要包含基本标题、...
学习
flutter2024-11-03
Flutter应用内更新App版本使用flutter_downloader而非ota_update
做当前App应用内更新的前提:用户可以在App更新的时候还可以使用软件,不能让他一直等待下载,关闭下载组件后,打开组件还能继续看到他的进度,并且用户锁屏或者短暂退出APP后需要保证任务不能总是挂掉,这里没有用到保活,而是需要用到生命周期去让他暂停和恢复,所以当前app还要有一个全局管理类保存任务id。UI图在最后 (插件文档说明可以通知栏显示,但是我用的这个版本在100%下完后总是failed,而不是complete,就不会很友好,后面...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录