GetxController介绍与使用指南

在实际的Flutter项目开发中,将UI代码与业务逻辑分离是保持项目架构清晰的关键。GetX框架提供的GetxController正是为此而生,它能有效提升代码可读性和维护性。

1. GetxController基础使用

应用程序入口设置

import 'package:flutter/material.dart';
import 'package:flutter_getx_example/GetXControllerExample/GetXControllerExample.dart';
import 'package:get/get.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: "GetX",
      home: GetXControllerExample(),
    );
  }
}

定义控制器

import 'package:flutter_getx_example/ObxCustomClassExample/Teacher.dart';
import 'package:get/get.dart';

class MyController extends GetxController {
  var teacher = Teacher();

  void convertToUpperCase() {
    teacher.name.value = teacher.name.value.toUpperCase();
    update();
  }
}

使用控制器

import 'package:flutter/material.dart';
import 'package:flutter_getx_example/GetXControllerExample/MyController.dart';
import 'package:get/get.dart';

class GetXControllerExample extends StatelessWidget {
  MyController myController = Get.put(MyController());

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("GetX Obx---GetXController")),
      body: Center(
        child: Column(
          children: [
            GetBuilder<MyController>(
              builder: (controller) {
                return Text(
                  "我的名字是 ${controller.teacher.name}",
                  style: TextStyle(color: Colors.green, fontSize: 30),
                );
              },
            ),
            ElevatedButton(
              onPressed: () => myController.convertToUpperCase(),
              child: Text("转换为大写"))
          ],
        ),
      ),
    );
  }
}

2. GetxController生命周期

class MyLifecycleController extends GetxController {
  var count = 0;

  void increment() async {
    await Future.delayed(Duration(milliseconds: 3000));
    count++;
    update();
  }

  
  void onInit() {
    print("初始化");
    super.onInit();
  }

  
  void onReady() {
    print("加载完成");
    super.onReady();
  }

  
  void onClose() {
    print("控制器被释放");
    super.onClose();
  }
}

3. 使用UniqueID局部更新

class CountController extends GetxController {
  var count = 0;

  void increment() {
    count++;
    update(['jimi_count']);
  }
}

4. GetView简化开发

GetView是一个继承自StatelessWidget的便捷类,内置了控制器访问功能,特别适合使用appuploader这类iOS开发助手工具时快速构建原型。

class ShopPage extends GetView<ShopController> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Title')),
      body: Center(
        child: Obx(() => Text("${controller.counter}")),
      ),
    );
  }
}

5. Binding自动依赖注入

结合appuploader等开发工具时,Binding可以自动管理控制器的生命周期:

class ShopControllerBinding implements Bindings {
  
  void dependencies() {
    Get.lazyPut<ShopController>(() => ShopController());
  }
}

在路由配置中使用:

GetPage(
  name: "/shop",
  page: () => ShopPage(),
  binding: ShopControllerBinding(),
)

开发建议

  1. 对于需要频繁更新的UI,建议使用Obx或GetX
  2. 对于性能敏感的场景,GetBuilder是更好的选择
  3. 使用UniqueID可以实现局部更新,优化性能
  4. 结合appuploader等开发工具时,Binding模式可以简化依赖管理

通过合理使用GetxController,可以显著提升Flutter应用的开发效率和代码质量。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐