• Flutter中GetX系列六--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(
    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和GetBuilder的区别:
    37. Obx的Controller作用域是在外面的,而GetX的Controller作用域只限于当前函数体里面的.
    38. GetBuilder和GetX的区别在于GetBuilder的性能会更高一点
    39. */
    40. // 第三种==>主动的
    41. GetBuilder(
    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().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(
    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(
    18. builder: (controller) {
    19. return Text(
    20. "计数器值为: ${controller.count}",
    21. style: TextStyle(color: Colors.red, fontSize: 30),
    22. );
    23. },
    24. ),
    25. GetBuilder(
    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. }

    注意事项:
            改方法存在一定的弊端,具体弊端详见
    <>中的最后的注意事项.所以建议使用

    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. //其中可以不用写
    7. Get.lazyPut(() => 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. }

  • 相关阅读:
    Meta推动全球AI助手革命:Llama 3引领技术前沿,Meta AI助手全面融入社交媒体平台
    C++ const与符号表
    fatal error: H5Cpp.h: No such file or directory #include “H5Cpp.h“
    使用Ref还是Reactive?
    MySQL-运算符
    Linux yum安装msql 8.0
    互联网寒潮,特送来 “App测试面试题“ 暖汤一份
    linux的持续性学习
    【C语言】刷题训练营 —— 每日一练
    leetcode经典面试150题---2.移除元素
  • 原文地址:https://blog.csdn.net/eastWind1101/article/details/128019032