Flutter架构设计插件cleanarch_dart的使用

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

Flutter架构设计插件cleanarch_dart的使用

cleanarch_dart

一个用于生成Clean Architecture文件夹和文件结构的Dart包。

参考资料

安装

首先,在项目根目录下安装 cleanarch 插件:

npm i --save-dev cleanarch

配置

在项目的根目录下创建一个名为 cleanarch-cli.config.json 的配置文件。该文件是一个简单的JSON,包含以下两个键:

  • commands: 命令对象数组。
  • schema: 模板对象数组。

Command 对象

Command 对象包含以下属性:

  • command: 命令入口。
  • comment: 命令的文本描述(可选)。
  • sufix: 命令与模板的关联名称。

Schema 对象

Schema 对象包含以下属性:

  • sufix: 生成类的后缀名,例如 “Usecase”。
  • extensionSufix: 文件扩展名后缀,例如 “.usecase”。
  • languageSufix: 当前只支持Dart语言,因此为 “.dart”。
  • defaultImplements: 如果类实现其他类,则使用数组声明其后缀名,例如 [“Interface”, “OtherSuffix”]。
  • defaultDependencies: 如果类依赖其他类,则使用数组声明其后缀名,例如 [“Protocol”]。
  • useDecorators: 如果类使用装饰器,则使用数组声明,例如 ["@Service()", “Other()”]。
  • folder: 生成文件所在的文件夹路径,例如 “./src/core/usecases/”。
  • abstract: 如果类是抽象类,则为 true,否则为 false

示例配置

{
    "commands": [
        {
            "command": "st",
            "sufix": "Strategy",
            "comment": "Generate an Strategy"
        },
        {
            "command": "uc",
            "sufix": "Usecase",
            "comment": "Generate an Usecase"
        },
        {
            "command": "pc",
            "sufix": "Protocol",
            "comment": "Generate an Protocol"
        },
        {
            "command": "ct",
            "sufix": "Connector",
            "comment": "Generate an Connector"
        }
    ],
    "schema": [
        {
            "sufix": "Strategy",
            "extensionSufix": ".strategy",
            "languageSufix": ".dart",
            "defaultImplementsSuffix": "",
            "defaultDependenciesSuffix": "",
            "useDecorators": [],
            "folder": "./core/strategies/",
            "defaultMethods": [
                "FutureOr<OUTPUT> call({required INPUT input});"
            ],
            "abstract": true
        },
        {
            "sufix": "Usecase",
            "extensionSufix": ".usecase",
            "languageSufix": ".dart",
            "defaultImplementsSuffix": "Strategy",
            "defaultDependenciesSuffix": "Protocol",
            "useDecorators": [],
            "defaultMethods": [],
            "folder": "./core/usecases/",
            "abstract": false
        },
        {
            "sufix": "Protocol",
            "extensionSufix": ".protocol",
            "languageSufix": ".dart",
            "defaultImplementsSuffix": "",
            "defaultMethods": [
                "FutureOr<OUTPUT> call({required INPUT input});"
            ],
            "defaultDependenciesSuffix": "",
            "useDecorators": [],
            "folder": "./core/protocols/",
            "abstract": true
        },
        {
            "sufix": "Connector",
            "extensionSufix": ".connector",
            "languageSufix": ".dart",
            "defaultImplementsSuffix": "Protocol",
            "defaultDependenciesSuffix": "",
            "defaultMethods": [],
            "useDecorators": [
                "import 'dart:async';"
            ],
            "folder": "./adapters/connectors/",
            "abstract": false
        }
    ]
}

使用方法

假设你有一个命令:

{
  "command": "st",
  "suffix": "Strategy",
  "comment": "Generate an Strategy"
}, 

以及对应的模板:

{
  "suffix": "Strategy",
  "extensionSufix": ".strategy",
  "languageSufix": ".dart",
  "defaultImplementsSuffix": "",
  "defaultDependenciesSuffix": "",
  "useDecorators": [],
  "folder": "./core/strategies/",
  "defaultMethods": [
      "FutureOr<OUTPUT> call({required INPUT input});"
  ],
  "abstract": true
},

要从命令行运行该命令,可以添加以下参数:

> st="ClassName1"

如果需要结合其他命令(例如实现特定类),可以这样写:

> st="ClassName" us="Other"

如果需要生成一组策略类:

> st="ClassName1 ClassName2"

默认命令

all

生成完整的架构结构。

> usage: all=<classes...>

u

使类使用指定名称的类集。

> usage: u=<classes...>

uo

使类使用指定名称的类集。

> usage: uo=<classes...>

i

使类实现指定的类集。

> usage: i=<classes...>

<classes ...> 的含义

一组以空格分隔的类名,例如:

> "Login Logout Any Other Classes"

示例

生成完整的架构结构

cleanarch_dart all="UserLogin UserLogout"

这将生成以下结构:

src>
    core>
        strategy>
            user-login.strategy.dart
            user-logout.strategy.dart
        usecases>
            user-login.usecase.dart
            user-logout.usecase.dart
        protocols>
            user-login.protocol.dart
            user-logout.protocol.dart
    adapters>
        connectors>
            user-login.connector.dart
            user-logout.connector.dart

更多关于Flutter架构设计插件cleanarch_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter架构设计插件cleanarch_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


cleanarch_dart 是一个用于 Flutter 项目的架构设计插件,它基于 Clean Architecture 原则,帮助开发者更好地组织和管理代码。Clean Architecture 是一种软件设计原则,旨在将应用程序的不同层(如 UI、业务逻辑和数据层)分离,以提高代码的可维护性、可测试性和可扩展性。

以下是使用 cleanarch_dart 插件的基本步骤和指南:

1. 安装 cleanarch_dart 插件

首先,你需要在 pubspec.yaml 文件中添加 cleanarch_dart 依赖:

dependencies:
  cleanarch_dart: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 创建 Clean Architecture 项目结构

Clean Architecture 通常将项目分为以下几个层:

  1. Presentation Layer: 负责 UI 和用户交互。
  2. Domain Layer: 包含业务逻辑和用例。
  3. Data Layer: 负责数据获取和存储。

你可以使用 cleanarch_dart 插件来生成这些层的模板代码。

3. 生成项目结构

使用 cleanarch_dart 插件提供的命令行工具来生成项目结构。例如:

flutter pub run cleanarch_dart:create -n MyApp

这将会生成一个名为 MyApp 的项目,并自动创建 Clean Architecture 所需的目录结构。

4. 编写代码

Presentation Layer

lib/presentation 目录下,你可以编写与 UI 相关的代码,如 Widgets、Pages 等。

// lib/presentation/pages/home_page.dart
import 'package:flutter/material.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: Text('Hello, Clean Architecture!'),
      ),
    );
  }
}

Domain Layer

lib/domain 目录下,你可以编写业务逻辑和用例。

// lib/domain/usecases/get_user_usecase.dart
import 'package:cleanarch_dart/cleanarch_dart.dart';

class GetUserUseCase extends UseCase<void, void> {
  @override
  Future<void> call(void params) async {
    // 业务逻辑
  }
}

Data Layer

lib/data 目录下,你可以编写与数据获取和存储相关的代码,如 Repositories、Data Sources 等。

// lib/data/repositories/user_repository.dart
import 'package:cleanarch_dart/cleanarch_dart.dart';

class UserRepository implements Repository {
  @override
  Future<void> getData() async {
    // 数据获取逻辑
  }
}

5. 依赖注入

为了将各层解耦,通常需要使用依赖注入(DI)。你可以使用 get_itprovider 等依赖注入框架来管理依赖。

// lib/injection_container.dart
import 'package:get_it/get_it.dart';
import 'package:cleanarch_dart/cleanarch_dart.dart';

final getIt = GetIt.instance;

void setup() {
  getIt.registerLazySingleton(() => GetUserUseCase());
  getIt.registerLazySingleton(() => UserRepository());
}

6. 运行应用

最后,你可以在 main.dart 中初始化依赖注入并运行应用。

// lib/main.dart
import 'package:flutter/material.dart';
import 'injection_container.dart';
import 'presentation/pages/home_page.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Clean Architecture Demo',
      home: HomePage(),
    );
  }
}

7. 测试

Clean Architecture 的一个重要优势是易于测试。你可以为每个层编写单元测试和集成测试,确保代码的质量和稳定性。

// test/domain/usecases/get_user_usecase_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:cleanarch_dart/cleanarch_dart.dart';

void main() {
  test('GetUserUseCase should fetch user data', () async {
    final useCase = GetUserUseCase();
    await useCase(null);
    // 断言和验证逻辑
  });
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!