下载地址:
https://pub-web.flutter-io.cn/packages/get
导入依赖:
dependencies:get: ^4.6.5
导入头文件:
import 'package:get/get.dart';
使用 Obx()
、 GetX<T>()
创建全局数据 Counter
,继承 GetxController
:
class Counter extends GetxController {/// 在使用GetX时,我们必须通过在值的末尾添加以下内容使变量可被观察到 **obs**在值的末尾加上然后,/// 当变量发生变化时,应用程序中依赖它的其他部分将得到通知。var count = 0.obs; // 等同于 RxInt count = 0.obs;increment() => count.value++;
}
添加依赖:
/// 注入依赖Counter controller = Get.put(Counter());
添加组件 Obx()
,监听显示数据:
/// 监听数据: Obx 返回一个组件
Obx(() => Text('您点击了${controller.count}次'),
),/// GetX<T>() 等同于 Obx()
GetX<Counter>(builder: (_) {return Text('您点击了${_.count}次');},
),
改变数据:
/// 改变数据
controller.increment();
使用 GetBuilder<T>()
创建全局数据 MyController
继承 GetxController
:
class MyController extends GetxController {var number = 0;add() {number++;update();// 监听数据更新}
}
添加依赖:
MyController controller = Get.put(MyController());
添加组件 GetBuilder<T>
:
GetBuilder<MyController>(init: controller,initState: (_) {},dispose: (state) {},builder: (_) {return Column(children: [Text('您点击了${_.number}次'),ElevatedButton(child: const Text("Click"),/// 改变数据onPressed: () => _.add(),),],);},),
使用 ValueBuilder<T?>
/// ValueBuilder 监听数据ValueBuilder<int?>(initialValue: 0,onDispose: () {},onUpdate: (p0) => print("$p0"),builder: (value, updater) {return Column(children: [Text('您点击了$value次'),ElevatedButton(child: const Text("Click"),onPressed: () {value = (value ?? 0) + 1;updater(value);//更新数据},),],);},),
在添加的依赖是全局的,考虑到内存释放问题,在页面deposit
的时候需要释放controller
void dispose() {super.dispose();/// 清除单例数据Get.delete<MyController>();}
如果需要到下一个页面访问该数据,需要使用 Get.find<T>()
函数:
MyController controller = Get.find<MyController>();
数据监听展示:
GetBuilder(init: controller,builder: (_) {return Column(children: [Text("${controller.number}"),ElevatedButton(child: const Text("Click"),onPressed: () {_.add();// 更新数据,上个页面的数据也会随之改变!!!},),],);},)
此时会出现一个问题,就是如果想创建两个同类型的model(即 runtimeType
相同)需要如何区分呢?这时需要用到 tag
参数,主要下面三个函数:
/// 添加依赖
MyController controller = Get.put(MyController(), tag: "one");
MyController controller = Get.put(MyController(), tag: "two");/// 访问数据
MyController controller = Get.find<MyController>(tag: "one");
MyController controller = Get.find<MyController>(tag: "two");/// 删除数据
Get.delete<MyController>(tag: "one");
Get.delete<MyController>(tag: "two");
上述主要用到 GetX
的状态管理功能,如果想使用它的路由管理功能需要将 MaterialApp
改为 GetMaterialApp
,这时候是不需要 content
的,例如页面 push
:
Get.to(() => const Page());