Flutter GetX模块化开发示例

在Flutter中使用GetX进行模块化开发时,如何合理划分模块结构?比如:

  1. 路由管理、状态管理、依赖注入等是否需要独立成单独模块?
  2. 模块间通信的最佳实践是什么?是通过Get.put/Get.find还是其他方式?
  3. 有没有推荐的目录结构规范?比如按功能模块划分还是按MVC模式划分?
  4. 能分享一个具体的模块化项目示例吗?特别想知道如何避免模块间的过度耦合
3 回复

以下是一个简单的Flutter GetX模块化开发示例:

  1. 创建项目结构

    lib/
    ├── modules/
    │   ├── home/
    │   │   ├── home_controller.dart
    │   │   ├── home_view.dart
    │   │   └── home_bindings.dart
    ├── app.dart
    ├── main.dart
    
  2. Home模块实现

    home_controller.dart

    import 'package:get/get.dart';
    
    class HomeController extends GetxController {
      var count = 0.obs;
    
      void increment() => count++;
    }
    

    home_view.dart

    import 'package:flutter/material.dart';
    import 'package:get/get.dart';
    import 'home_controller.dart';
    
    class HomeView extends StatelessWidget {
      final HomeController controller = Get.put(HomeController());
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Home')),
          body: Center(
            child: Obx(() => Text('Count: ${controller.count}')),
          ),
          floatingActionButton: FloatingActionButton(onPressed: controller.increment),
        );
      }
    }
    

    home_bindings.dart

    import 'package:get/get.dart';
    import 'home_controller.dart';
    import 'home_view.dart';
    
    class HomeBindings implements Bindings {
      @override
      void dependencies() {
        Get.lazyPut(() => HomeController());
        Get.lazyPut(() => HomeView());
      }
    }
    
  3. App初始化

    app.dart

    import 'package:get/get.dart';
    import 'modules/home/home_bindings.dart';
    
    class App {
      static void setupModules() {
        Get.lazyPut(() => GetMaterialController());
        Get.put(HomeController());
        Get.put(HomeView());
        Get.put(HomeBindings());
      }
    }
    
  4. Main函数

    main.dart

    import 'package:flutter/material.dart';
    import 'app.dart';
    
    void main() {
      App.setupModules();
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return GetMaterialApp(
          home: GetBuilder<HomeController>(
            builder: (_) => HomeView(),
          ),
        );
      }
    }
    

通过这种方式,你可以轻松实现Flutter的模块化开发,每个模块都具有独立的控制器、视图和绑定。

更多关于Flutter GetX模块化开发示例的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


以下是一个简单的Flutter GetX模块化开发示例:

  1. 项目结构
lib/
├── modules/
│   ├── home/
│   │   ├── home_controller.dart
│   │   ├── home_page.dart
│   │   └── home_binding.dart
│   └── profile/
│       ├── profile_controller.dart
│       ├── profile_page.dart
│       └── profile_binding.dart
├── app.dart
└── main.dart
  1. main.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'app.dart';

void main() {
  runApp(App());
}
  1. app.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'modules/home/home_binding.dart';
import 'modules/profile/profile_binding.dart';

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      initialBinding: HomeBinding(),
      getPages: [
        GetPage(name: '/', page: () => HomePage(), binding: HomeBinding()),
        GetPage(name: '/profile', page: () => ProfilePage(), binding: ProfileBinding()),
      ],
      home: HomePage(),
    );
  }
}
  1. modules/home/home_page.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'home_controller.dart';

class HomePage extends StatelessWidget {
  final HomeController controller = Get.put(HomeController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(child: Obx(() => Text('Count: ${controller.count}'))),
    );
  }
}
  1. modules/home/home_controller.dart
import 'package:get/get.dart';

class HomeController extends GetxController {
  var count = 0.obs;

  void increment() => count++;
}
  1. modules/home/home_binding.dart
import 'package:get/get.dart';
import 'home_controller.dart';

class HomeBinding implements Bindings {
  @override
  void dependencies() {
    Get.lazyPut(() => HomeController());
  }
}

其他模块(如profile)可按相同方式实现。通过绑定和页面分离,实现模块化管理。

以下是一个Flutter GetX模块化开发的简单示例,帮助你快速理解如何组织代码:

  1. 项目结构(推荐)
lib/
├── app/
│   ├── modules/
│   │   ├── home/
│   │   │   ├── home_binding.dart
│   │   │   ├── home_controller.dart
│   │   │   ├── home_page.dart
│   │   ├── product/
│   │   │   ├── product_binding.dart
│   │   │   ├── product_controller.dart
│   │   │   ├── product_page.dart
│   ├── routes/
│   │   ├── app_pages.dart
│   │   ├── app_routes.dart
  1. 核心代码示例

(1) 路由管理 (app/routes/app_pages.dart)

class AppPages {
  static final routes = [
    GetPage(
      name: Routes.HOME, 
      page: () => HomePage(), 
      binding: HomeBinding(),
    ),
    GetPage(
      name: Routes.PRODUCT,
      page: () => ProductPage(),
      binding: ProductBinding(),
    ),
  ];
}

(2) 模块示例 - Home模块 (app/modules/home/)

// home_controller.dart
class HomeController extends GetxController {
  final count = 0.obs;
  void increment() => count.value++;
}

// home_binding.dart
class HomeBinding implements Bindings {
  @override
  void dependencies() {
    Get.lazyPut(() => HomeController());
  }
}

// home_page.dart
class HomePage extends GetView<HomeController> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Obx(() => Text("Count: ${controller.count.value}")),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: controller.increment,
        child: Icon(Icons.add),
      ),
    );
  }
}
  1. 启动应用 (main.dart)
void main() {
  runApp(GetMaterialApp(
    initialRoute: Routes.HOME,
    getPages: AppPages.routes,
  ));
}

关键点:

  1. 每个模块包含自己的Controller、Binding和View
  2. Binding负责依赖注入
  3. 通过GetView简化Controller访问
  4. 路由集中管理

这样可以保持代码高内聚低耦合,便于团队协作和维护。

回到顶部