Flutter架构设计插件cleanarch_dart的使用
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
更多关于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 通常将项目分为以下几个层:
- Presentation Layer: 负责 UI 和用户交互。
- Domain Layer: 包含业务逻辑和用例。
- 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_it
或 provider
等依赖注入框架来管理依赖。
// 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);
// 断言和验证逻辑
});
}