GetX 入门教程(Android 开发者速通版)

GetX 入门教程(Android 开发者速通版)

目标:从 0 到 1 使用 GetX 管理路由、状态、依赖注入与常用交互。示例基于 Flutter + GetX 4.x。


1. 依赖引入

pubspec.yaml 中添加(你项目已包含 get: ^4.6.6 则跳过):

yaml 复制代码
dependencies:
  get: ^4.6.6
bash 复制代码
flutter pub get

2. 启动入口:使用 GetMaterialApp

MaterialApp 替换为 GetMaterialApp(提供路由/导航/多语言等能力):

dart 复制代码
import 'package:flutter/material.dart';
import 'package:get/get.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'GetX Demo',
      initialRoute: Routes.home,
      getPages: AppPages.pages,
      theme: ThemeData.light(),
    );
  }
}

3. 路由与页面

定义路由常量与页面表:

dart 复制代码
class Routes {
  static const home = '/';
  static const detail = '/detail';
}

class AppPages {
  static final pages = <GetPage>[
    GetPage(name: Routes.home, page: () => const HomePage(), binding: HomeBinding()),
    GetPage(name: Routes.detail, page: () => const DetailPage(), binding: DetailBinding()),
  ];
}

导航方式:

  • Get.to(() => DetailPage());
  • Get.toNamed(Routes.detail, arguments: {'id': 1});
  • Get.offAllNamed(Routes.home);
  • Get.back(result: 'ok');

接收参数:

dart 复制代码
final args = Get.arguments; // 或 Get.parameters['id']

4. 控制器与状态管理

两种常用方案:

  1. 响应式(Obx + Rx)
dart 复制代码
class HomeController extends GetxController {
  final RxInt counter = 0.obs;
  void inc() => counter.value++;
}

class HomePage extends GetView<HomeController> {
  const HomePage({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home')),
      body: Center(child: Obx(() => Text('count: ${controller.counter.value}'))),
      floatingActionButton: FloatingActionButton(onPressed: controller.inc),
    );
  }
}
  1. 传统(GetBuilder + update)
dart 复制代码
class DetailController extends GetxController {
  int value = 0;
  void inc() { value++; update(); }
}

GetBuilder<DetailController>(builder: (c) => Text('${c.value}'));

对比:

  • Obx:细粒度、自动刷新、基于 .obs
  • GetBuilder:手动 update(),更接近 setState。

5. 依赖注入(DI)与 Bindings

  • 即时注入:Get.put(HomeController());
  • 懒注入:Get.lazyPut(() => HomeController());
  • 查找:final c = Get.find<HomeController>();

使用 Binding 绑定到路由:

dart 复制代码
class HomeBinding extends Bindings {
  @override
  void dependencies() {
    Get.lazyPut<HomeController>(() => HomeController());
  }
}

页面通过:class HomePage extends GetView<HomeController> { ... }

全局服务(常驻):

dart 复制代码
class AuthService extends GetxService {
  Future<AuthService> init() async { /* load token */ return this; }
}
// 启动时:await Get.putAsync(() => AuthService().init());

6. 常用交互(无需 context)

dart 复制代码
Get.snackbar('标题', '内容', snackPosition: SnackPosition.BOTTOM);
Get.defaultDialog(title: '提示', middleText: '确认吗?', onConfirm: Get.back);
Get.bottomSheet(Container(height: 200, color: Colors.white));

7. 生命周期与 Workers

dart 复制代码
class HomeController extends GetxController {
  final RxString keyword = ''.obs;

  @override
  void onInit() {
    super.onInit();
    // 防抖
    debounce(keyword, (_) => search(keyword.value), time: const Duration(milliseconds: 300));
  }

  Future<void> search(String k) async {}
}

其他:onReady() 页面渲染后回调;onClose() 释放资源。


8. 异步与网络调用(示例)

dart 复制代码
class ApiClient {
  Future<String> fetchTitle() async {
    await Future.delayed(const Duration(milliseconds: 200));
    return 'Hello GetX';
  }
}

class DetailController extends GetxController {
  final ApiClient api;
  DetailController(this.api);

  final RxString title = ''.obs;

  @override
  void onInit() {
    super.onInit();
    load();
  }

  Future<void> load() async {
    title.value = await api.fetchTitle();
  }
}

class DetailBinding extends Bindings {
  @override
  void dependencies() {
    Get.lazyPut<ApiClient>(() => ApiClient());
    Get.put(DetailController(Get.find<ApiClient>()));
  }
}

9. 目录建议(小型项目)

arduino 复制代码
lib/
  modules/
    home/
      home_view.dart
      home_controller.dart
      home_binding.dart
    detail/
      detail_view.dart
      detail_controller.dart
      detail_binding.dart
  routes/
    app_pages.dart
    app_routes.dart
  services/
    auth_service.dart

10. 易踩坑

  • 忘记用 GetMaterialApp → 导航/多语言等 API 不可用。
  • 混用 ObxGetBuilder 时刷新逻辑混乱 → 明确一处为主。
  • 大对象频繁 set → 细化为多个 .obs 避免全量重建。
  • 依赖注入找不到 → 检查 Binding 是否挂到路由、时序是否在 Get.find 之前。

11. 快速清单

  • 引入依赖 → 使用 GetMaterialApp
  • 定义 RoutesGetPage
  • Binding 中注册 Controller/Service
  • 页面通过 GetView<C> 获取 controller
  • 状态:Obx(.obs) 或 GetBuilder(update)
  • 导航:Get.to/...,提示:Get.snackbar/dialog/bottomSheet

相关推荐
晚霞的不甘1 小时前
性能与体验的终极博弈:Flutter 在 OpenHarmony 上的启动优化、内存治理与功耗控制
flutter
嘴贱欠吻!2 小时前
开源鸿蒙-Flutter基础-dart学习-1
学习·flutter·开源
kirk_wang2 小时前
Flutter三方库鸿蒙适配深度解析:从架构原理到性能优化实践
flutter·移动开发·跨平台·arkts·鸿蒙
Ya-Jun2 小时前
架构设计模式:MVVM架构应用
flutter·架构
AskHarries3 小时前
半天、200 元,我把自己的 App 做出来并上架了 App Store
flutter
陈朝晖SHS3 小时前
Flutter项目结合iOS OC原生页面禁止截屏
flutter·ios
sunly_3 小时前
Flutter:布局:NestedScrollView+SliverAppBar+SmartRefresher(分页),实现顶部背景图+导航栏渐变+分页列表
flutter
西西学代码3 小时前
flutter---进度条
前端·javascript·flutter