Flutter模块生成插件flutter_modules_generator的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter模块生成插件flutter_modules_generator的使用

flutter_modules_generator 是一个强大的命令行工具,旨在为Flutter项目自动化生成模块结构。该工具创建有组织的文件夹层次结构和模板文件,包括控制器、绑定、业务逻辑、数据模型、服务、视图和测试模板。通过遵循SOLID原则并促进测试驱动开发(TDD),它简化了项目的设置,并强制执行一致且可扩展的代码结构。

关键特性

  • 自动生成模块化和测试就绪的文件夹结构。
  • 确保代码遵循SOLID原则,以保持代码可维护性。
  • 支持测试驱动开发(TDD)并提供可选的测试模板。
  • 支持流行的包如GetX和Dio。
  • 支持QuickType用于从JSON生成模型。

安装

dart pub global activate flutter_modules_generator

使用

基本命令

dart pub global run flutter_modules_generator <module_name> <usecases> <services>

例如:

dart pub global run flutter_modules_generator user "create,read,update,delete" "auth,logger"

生成带测试模板的代码

要包含测试文件,在生成时使用--include-tests标志:

dart pub global run flutter_modules_generator <module_name> <usecases> <services> --include-tests

例如:

dart pub global run flutter_modules_generator user "create,read,update,delete" "auth,logger" --include-tests

自动生成GetX路由和页面

当使用--include-route标志时,CLI会自动注册页面和路由:

dart pub global run flutter_modules_generator user "create,read,update,delete" "auth,logger" --include-route

从JSON生成模型

确保安装了quicktype来自动化从JSON文件生成模型:

npm install -g quicktype

当使用--include-model标志时,应在模块的位置有一个JSON文件:your_module/data/json/

dart pub global run flutter_modules_generator user "" "" --include-model

依赖项

确保您的pubspec.yaml文件包含以下依赖项:

dependencies:
  flutter:
    sdk: flutter

  get: ^5.0.0-release-candidate-9.2.1
  dio: ^5.7.0

dev_dependencies:
  flutter_test:
    sdk: flutter

  mockito: ^5.4.5
  http_mock_adapter: ^0.6.1
  build_runner: ^2.4.14

生成结构示例

生成的结构示例如下:

- user/
  - controller/
      - user_controller.dart
      - bindings/
          - user_binding.dart
      - usecases/
          - create.dart
          - read.dart
          - update.dart
          - delete.dart
  - data/
      - api/
          - user_api.dart
      - json/
      - models/
      - services/
          - auth_service.dart
          - logger_service.dart
  - views/
      - viewmodels/
      - widgets/
      - user_view.dart

生成的测试结构

当使用--include-tests标志时,将创建以下测试文件夹结构:

- user/
  - unit/
      - usecases/
          - create_test.dart
          - read_test.dart
          - update_test.dart
          - delete_test.dart
      - data/
          - api/
              - user_api_test.dart
          - models/
          - services/
              - auth_service_test.dart
              - logger_service_test.dart
      - viewmodels/
  - widget/
      - widgets/
          - user_widgets_test.dart
      - user_view_test.dart

必备文件

您可以手动创建或从CLI自动生成这些文件。

api_base.dart

import 'package:dio/dio.dart';

abstract class IBaseApi {
  Dio dioApi();
}

app_pages.dart

import 'package:get/get.dart';

class AppPages {
  static List<GetPage<dynamic>>? getPages() {
    return [
      
    ];
  }
}

app_routes.dart

class AppRoutes {
  
}

工具生成的示例文件

控制器层

管理状态使用GetX。 user_controller.dart

import 'package:get/get.dart';

class UserController extends GetxController {}

user_binding.dart

import 'package:get/get.dart';

class UserBinding implements Binding {
  [@override](/user/override)
  List<Bind> dependencies() {
    return [
      Bind.lazyPut(() => UserController()),
    ];
  }
}

封装业务逻辑在usecases中。 create.dart

extension Create on UserController {}

abstract class ICreateData<T> {
  Future<T> consume();
}

class CreateData implements ICreateData {
  [@override](/user/override)
  Future consume() async {}
}

delete.dart

extension Delete on UserController {}

abstract class IDeleteData<T> {
  Future<T> consume();
}

class DeleteData implements IDeleteData {
  [@override](/user/override)
  Future consume() async {}
}

read.dart

extension Read on UserController {}

abstract class IReadData<T> {
  Future<T> consume();
}

class ReadData implements IReadData {
  [@override](/user/override)
  Future consume() async {}
}

update.dart

extension Update on UserController {}

abstract class IUpdateData<T> {
  Future<T> consume();
}

class UpdateData implements IUpdateData {
  [@override](/user/override)
  Future consume() async {}
}

数据层

user_api.dart

import 'package:dio/dio.dart';

class UserApi implements IBaseApi {
  static final UserApi _instance = UserApi._internal();

  factory UserApi() => _instance;

  UserApi._internal();

  final Dio _dio = Dio(
    BaseOptions(
      baseUrl: 'http://api.example.com/v1',
      connectTimeout: Duration(seconds: 30),
      receiveTimeout: Duration(seconds: 30),
    ),
  )..interceptors.addAll([]);

  [@override](/user/override)
  Dio dioApi() => _dio;
}

auth_service.dart

import 'package:dio/dio.dart';
import 'api_base.dart';

abstract class IAuthData<T> {
  Future<T> consume();
}

class AuthService<T> implements IAuthData {
  final IBaseApi api;

  AuthService({required this.api});

  [@override](/user/override)
  Future<T> consume() async {
    try {
      // 添加您的逻辑
    } on DioException catch (e) {
      throw Exception(e.toString());
    } catch (e) {
      throw Exception(e.toString());
    }
  }
}

logger_service.dart

import 'package:dio/dio.dart';
import 'api_base.dart';

abstract class ILoggerData<T> {
  Future<T> consume();
}

class LoggerService<T> implements ILoggerData {
  final IBaseApi api;

  LoggerService({required this.api});

  [@override](/user/override)
  Future<T> consume() async {
    try {
      // 添加您的逻辑
    } on DioException catch (e) {
      throw Exception(e.toString());
    } catch (e) {
      throw Exception(e.toString());
    }
  }
}

视图层

user_view.dart

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

class UserView extends GetView<UserController> {
  const UserView({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('User View'),
      ),
      body: Center(
        child: const Text('Welcome to User View'),
      ),
    );
  }
}

更多关于Flutter模块生成插件flutter_modules_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模块生成插件flutter_modules_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,flutter_modules_generator 是一个用于自动生成 Flutter 模块的工具,它可以帮助开发者快速地将 Flutter 项目中的一部分代码分离为独立的模块。以下是一个使用 flutter_modules_generator 的基本示例代码案例。

前提条件

  1. 确保你已经安装了 Flutter 和 Dart SDK。
  2. 确保你的 Flutter 项目已经存在。

安装 flutter_modules_generator

首先,你需要在你的 Flutter 项目中安装 flutter_modules_generator 包。可以通过添加以下依赖到你的 pubspec.yaml 文件来实现(但注意,这个包通常是通过命令行工具使用的,而不是作为常规依赖项):

# pubspec.yaml
dependencies:
  flutter:
    sdk: flutter

# flutter_modules_generator 不是一个常规的依赖项,因此不需要在这里添加
# 但你需要确保全局安装了 flutter_modules_generator 工具

然而,flutter_modules_generator 实际上是一个命令行工具,而不是一个 Flutter 包依赖。你需要通过以下命令全局安装它:

dart pub global activate flutter_modules_generator

配置 module_config.yaml

在你的 Flutter 项目根目录下创建一个 module_config.yaml 文件,用于配置模块生成的相关信息。以下是一个简单的配置示例:

# module_config.yaml
flutter_modules:
  - name: my_feature_module
    platform_channels: true
    plugin: false
    host_app_dependencies: true
    include_fonts: true
    include_assets: true
    include_ios_bitcode: true

使用 flutter_modules_generator 生成模块

在命令行中导航到你的 Flutter 项目根目录,然后运行以下命令来生成模块:

flutter_modules_generator generate

这个命令会根据 module_config.yaml 中的配置生成一个新的 Flutter 模块。生成的模块通常会位于你项目根目录下的一个新文件夹中(例如,my_feature_module)。

生成的模块结构

生成后的模块会包含标准的 Flutter 模块结构,例如:

my_flutter_app/
├── android/
├── ios/
├── lib/
│   └── main.dart
├── my_feature_module/  # 这是生成的模块
│   ├── android/
│   ├── ios/
│   ├── lib/
│   │   └── main.dart
│   ├── .gitignore
│   ├── .metadata
│   ├── pubspec.yaml
│   └── README.md
├── pubspec.yaml
└── ...

使用生成的模块

在生成模块后,你可以在其他 Flutter 应用或模块中通过添加依赖来使用它。例如,在 pubspec.yaml 中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  my_feature_module:
    path: ./my_feature_module

然后,你可以在你的 Flutter 应用中导入并使用该模块:

import 'package:my_feature_module/main.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 使用 my_feature_module 中的组件或功能
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('My Flutter App'),
        ),
        body: Center(
          child: MyFeatureWidget(), // 假设这是 my_feature_module 中定义的一个组件
        ),
      ),
    );
  }
}

总结

以上是使用 flutter_modules_generator 生成 Flutter 模块的基本步骤和代码案例。通过这个工具,你可以快速地将 Flutter 项目中的一部分代码分离为独立的模块,从而提高代码的可重用性和模块化程度。

回到顶部