当前位置:   article > 正文

Flutter中GetX系列六--GetxController/GetView使用详情

getxcontroller

1.GetxController介绍

在实际的项目开发过程中,我们不可能把UI代码、业务逻辑都放在一起处理,这样对项目的架构、代码的可读性、后期的维护将会是致命的,好在GetX为我们提供了GetxController,GetxController主要的作用是用于UI代码与业务逻辑分离开来。

这里主要讲解使用GetxController动态获取数据的三种方式以及更新数据的方式

第一步:应用程序入口设置

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_getx_example/GetXControllerExample/GetXControllerExample.dart';
  3. import 'package:get/get.dart';
  4. void main() {
  5. runApp(MyApp());
  6. }
  7. class MyApp extends StatelessWidget {
  8. @override
  9. Widget build(BuildContext context) {
  10. return GetMaterialApp(
  11. title: "GetX",
  12. home: GetXControllerExample(),
  13. );
  14. }
  15. }

第二步:定义控制器继承自GetxController

  1. import 'package:flutter_getx_example/ObxCustomClassExample/Teacher.dart';
  2. import 'package:get/get.dart';
  3. class MyController extends GetxController {
  4. // 第一种
  5. // var teacher = Teacher();
  6. //
  7. // void convertToUpperCase() {
  8. // teacher.name.value = teacher.name.value.toUpperCase();
  9. // }
  10. // 第二种
  11. // var teacher = Teacher(name: "Jimi", age: 18).obs;
  12. // void convertToUpperCase() {
  13. // teacher.update((val) {
  14. // teacher.value.name = teacher.value.name.toString().toUpperCase();
  15. // });
  16. // }
  17. // 第三种
  18. var teacher = Teacher();
  19. void convertToUpperCase() {
  20. teacher.name.value = teacher.name.value.toUpperCase();
  21. update();
  22. //1.主动的去调用更新.也可以在update()增加一个id的数组.在调用的使用只有当调用显示的id包含在该id数组里面的时候,才会有效.
  23. //2.用来触发/刷新调用的时候obx()函数.这样数据就刷新了.
  24. }
  25. }

第三步:实例化控制器并使用

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_getx_example/GetXControllerExample/MyController.dart';
  3. import 'package:get/get.dart';
  4. class GetXControllerExample extends StatelessWidget {
  5. // 第一种
  6. MyController myController = Get.put(MyController());
  7. //如果该MyController已经在其他页面使用过了,在另外页面需要重新使用的时候,无需 Get.put,直接使用 Get.find即可.
  8. //MyController myController = Get.find();或者MyController countController= Get.find< MyController >();
  9. @override
  10. Widget build(BuildContext context) {
  11. return Scaffold(
  12. appBar: AppBar(
  13. title: Text("GetX Obx---GetXController"),
  14. ),
  15. body: Center(
  16. child: Column(
  17. mainAxisAlignment: MainAxisAlignment.center,
  18. crossAxisAlignment: CrossAxisAlignment.center,
  19. children: [
  20. // 第一种==>被动的
  21. // Obx(() => Text(
  22. // "我的名字是 ${myController.teacher.name}",
  23. // style: TextStyle(color: Colors.red, fontSize: 30),
  24. // )),
  25. // 第二种==>被动的
  26. // GetX<MyController>(
  27. // init: MyController(),
  28. // builder: (controller) {
  29. // return Text(
  30. // "我的名字是 ${controller.teacher.name}",
  31. // style: TextStyle(color: Colors.green, fontSize: 30),
  32. // );
  33. // },
  34. // ),
  35. /*
  36. Obx和GetX<MyController>和GetBuilder<MyController>的区别:
  37. Obx的Controller作用域是在外面的,而GetX<MyController>的Controller作用域只限于当前函数体里面的.
  38. GetBuilder<MyController>和GetX<MyController>的区别在于GetBuilder<MyController>的性能会更高一点
  39. */
  40. // 第三种==>主动的
  41. GetBuilder<MyController>(
  42. //id:**,该id如何在update()函数数据里面存在的时候,这里的属性值才会跟着发生变化.默认不写的话,是包含的.
  43. init: myController,//init方法可以省略不要
  44. builder: (controller) {
  45. return Text(
  46. "我的名字是 ${controller.teacher.name}",
  47. style: TextStyle(color: Colors.green, fontSize: 30),
  48. );
  49. },
  50. ),
  51. SizedBox(height: 20,),
  52. ElevatedButton(
  53. onPressed: () {
  54. // 第一种
  55. myController.convertToUpperCase();
  56. // 第二种
  57. // Get.find<MyController>().convertToUpperCase();
  58. },
  59. child: Text("转换为大写"))
  60. ],
  61. ),
  62. ),
  63. );
  64. }
  65. }

2.GetxController生命周期

这里主要讲解GetxController的生命周期,包括初始化加载完成销毁等。

第一步:应用程序入口设置

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_getx_example/GetXControllerLifecycleMethodsExample/GetXControllerLifecycleMethodExample.dart';
  3. import 'package:get/get.dart';
  4. void main() {
  5. runApp(MyApp());
  6. }
  7. class MyApp extends StatelessWidget {
  8. @override
  9. Widget build(BuildContext context) {
  10. return GetMaterialApp(
  11. title: "GetX",
  12. home: GetXControllerLifecycleMethodExample(),
  13. );
  14. }
  15. }

第二步:定义控制器继承自GetxController

  1. import 'package:get/get.dart';
  2. class MyLifecycleController extends GetxController {
  3. var count = 0;
  4. void increment() async {
  5. await Future.delayed(Duration(milliseconds: 3000));
  6. count++;
  7. update();
  8. }
  9. void cleanTask() {
  10. print("清除了任务");
  11. }
  12. }

第三步:重写GetxController生命周期方法

  1. @override
  2. void onInit() {
  3. // TODO: implement onInit
  4. print("初始化");
  5. super.onInit();
  6. }
  7. @override
  8. void onReady() {
  9. // TODO: implement onReady
  10. print("加载完成");
  11. super.onReady();
  12. }
  13. @override
  14. void onClose() {
  15. // TODO: implement onClose
  16. print("控制器被释放");
  17. super.onClose();
  18. }

第四步:实例化控制器并使用

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_getx_example/GetXControllerLifecycleMethodsExample/MyLifecycleController.dart';
  3. import 'package:get/get.dart';
  4. class GetXControllerLifecycleMethodExample extends StatelessWidget {
  5. MyLifecycleController myLifecycleController = Get.put(MyLifecycleController());
  6. @override
  7. Widget build(BuildContext context) {
  8. print("build");
  9. return Scaffold(
  10. appBar: AppBar(
  11. title: Text("GetXControllerLifecycleMethod"),
  12. ),
  13. body: Center(
  14. child: Column(
  15. mainAxisAlignment: MainAxisAlignment.center,
  16. crossAxisAlignment: CrossAxisAlignment.center,
  17. children: [
  18. GetBuilder<MyLifecycleController>(
  19. initState: (data) => myLifecycleController.increment(),
  20. dispose: (_) => myLifecycleController.cleanTask(),
  21. builder: (controller) {
  22. return Text(
  23. "计数器值为: ${myLifecycleController.count}",
  24. style: TextStyle(color: Colors.green, fontSize: 30),
  25. );
  26. },
  27. ),
  28. ],
  29. ),
  30. ),
  31. );
  32. }
  33. }

控制台输出结果

  1. flutter: 初始化
  2. [GETX] Instance "MyLifecycleController" has been created
  3. [GETX] Instance "MyLifecycleController" has been initialized
  4. [GETX] Instance "GetMaterialController" has been created
  5. [GETX] Instance "GetMaterialController" has been initialized
  6. flutter: build
  7. flutter: 加载完成
  8. flutter: build
  9. flutter: build

3.GetxController UniqueID(单独修改某一个地方的属性值,其余页面不变)

我们在开发的过程中会碰到一种情况,就是多个地方引用了同一个属性,但我只想单独更新某一个地方,那么就可以用UniqueID来进行区分。

第一步:应用程序入口设置

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_getx_example/GetXControllerUniqueIDExample/GetXControllerUniqueIDExample.dart';
  3. import 'package:get/get.dart';
  4. void main() {
  5. runApp(MyApp());
  6. }
  7. class MyApp extends StatelessWidget {
  8. @override
  9. Widget build(BuildContext context) {
  10. return GetMaterialApp(
  11. title: "GetX",
  12. home: GetXControllerUniqueIDExample(),
  13. );
  14. }
  15. }

第二步:定义控制器继承自GetxController,并且定义uniqueID

  1. import 'package:get/get.dart';
  2. class CountController extends GetxController {
  3. var count = 0;
  4. void increment() {
  5. count++;
  6. update(['jimi_count']);
  7. }
  8. }

第三步:实例化控制器并使用

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_getx_example/GetXControllerUniqueIDExample/CountConroller.dart';
  3. import 'package:get/get.dart';
  4. class GetXControllerUniqueIDExample extends StatelessWidget {
  5. CountController countController = Get.put(CountController());
  6. @override
  7. Widget build(BuildContext context) {
  8. return Scaffold(
  9. appBar: AppBar(
  10. title: Text("GetX Obx---GetXController"),
  11. ),
  12. body: Center(
  13. child: Column(
  14. mainAxisAlignment: MainAxisAlignment.center,
  15. crossAxisAlignment: CrossAxisAlignment.center,
  16. children: [
  17. GetBuilder<CountController>(
  18. builder: (controller) {
  19. return Text(
  20. "计数器值为: ${controller.count}",
  21. style: TextStyle(color: Colors.red, fontSize: 30),
  22. );
  23. },
  24. ),
  25. GetBuilder<CountController>(
  26. id: 'jimi_count',
  27. builder: (controller) {
  28. return Text(
  29. "计数器值为: ${controller.count}",
  30. style: TextStyle(color: Colors.green, fontSize: 30),
  31. );
  32. },
  33. ),
  34. SizedBox(height: 20,),
  35. ElevatedButton(
  36. onPressed: () => countController.increment(),
  37. child: Text("增加"))
  38. ],
  39. ),
  40. ),
  41. );
  42. }
  43. }

注意事项:
        改方法存在一定的弊端,具体弊端详见
<<Flutter中GetX系列七--依赖注入(put,lazyPut,putAsync)、Binding(统一初始化)>>中的最后的注意事项.所以建议使用<Flutter中GetX系列七中的方法.

4.GetView介绍使用详情

    GetView 只是对已注册的 Controller 有一个名为 controller 的getter的 const Stateless 的

Widget,如果我们只有单个控制器作为依赖项,那我们就可以使用 GetView ,而不是使用

StatelessWidget ,并且避免了写 Get.Find() 

4.1.GetView如何使用

GetView的使用方法非常简单,只是要将你的视图层继承自 GetView 并传入需要注册的控制器并

Get.put() 即可,我们来看下代码演示:

4.2.GetView结合GetxController使用

第一步 、定义一个CountController

  1. import 'package:get/get.dart';
  2. class ShopController extends GetxController {
  3. RxInt counter = 10.obs;
  4. void onInit() {
  5. print("onInit");
  6. super.onInit();
  7. }
  8. @override
  9. void onReady() {
  10. print("onReady");
  11. super.onReady();
  12. }
  13. @override
  14. void onClose() {
  15. print("onClose");
  16. super.onClose();
  17. }
  18. void inc() {
  19. counter.value++;
  20. update();
  21. }
  22. }

第二步 、继承GetView并使用状态管理

  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import '../controllers/shop.dart';
  4. /**
  5. * 1.必须继承get系统的GetView;
  6. * 2.<>里面的为你所需要使用到的自定义类
  7. */
  8. class ShopPage extends GetView<ShopController> {
  9. const ShopPage({super.key});
  10. @override
  11. Widget build(BuildContext context) {
  12. //如果第一次使用还需要put
  13. Get.put(CountController());
  14. return Scaffold(
  15. appBar: AppBar(
  16. title: const Text('Title'),
  17. ),
  18. body: Center(
  19. child: Column(
  20. children: [
  21. Obx(() => Text("${controller.counter}")),
  22. const SizedBox(
  23. height: 40,
  24. ),
  25. ElevatedButton(
  26. onPressed: () {
  27. controller.inc();
  28. },
  29. child: const Text("shop counter+1"))
  30. ],
  31. ),
  32. ),
  33. );
  34. }
  35. }

5.GetView Binding结合GetxController使用(不需要再写get.put)

第一步 、定义一个shopController

  1. import 'package:get/get.dart';
  2. class ShopController extends GetxController {
  3. RxInt counter = 10.obs;
  4. void onInit() {
  5. print("onInit");
  6. super.onInit();
  7. }
  8. @override
  9. void onReady() {
  10. print("onReady");
  11. super.onReady();
  12. }
  13. @override
  14. void onClose() {
  15. print("onClose");
  16. super.onClose();
  17. }
  18. void inc() {
  19. counter.value++;
  20. update(['first_count']);
  21. }
  22. }

第二步 、定义一个shop Binding

  1. import 'package:get/get.dart';
  2. import '../controllers/shop.dart';
  3. class ShopControllerBinding implements Bindings{
  4. @override
  5. void dependencies() {
  6. //其中<ShopController>可以不用写
  7. Get.lazyPut<ShopController>(() => ShopController());
  8. }
  9. }

第三步 、路由中绑定Binding

  1. import 'package:get/get.dart';
  2. import '../pages/tabs.dart';
  3. import '../pages/shop.dart';
  4. import '../binding/shop.dart';
  5. import '../middlewares/shopMiddleware.dart';
  6. class AppPage {
  7. static final routes = [
  8. GetPage(name: "/", page: () => const Tabs()),
  9. GetPage(
  10. name: "/shop",
  11. page: () => const ShopPage(),//路由
  12. binding: ShopControllerBinding(),//全局的getxController
  13. middlewares: [ShopMiddleWare()]//中间件->作为页面跳转前的条件判断
  14. ),
  15. ];
  16. }

第四步 、继承GetView并使用状态管理

  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import '../controllers/shop.dart';
  4. class ShopPage extends GetView<ShopController> {
  5. const ShopPage({super.key});
  6. @override
  7. Widget build(BuildContext context) {
  8. return Scaffold(
  9. appBar: AppBar(
  10. title: const Text('Title'),
  11. ),
  12. body: Center(child: Obx(() {
  13. return Text("${controller.counter}");
  14. })),
  15. );
  16. }
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/257366
推荐阅读
相关标签
  

闽ICP备14008679号