Flutter架构设计插件pure_clean_architecture_cli的使用
Flutter架构设计插件pure_clean_architecture_cli的使用
pure_clean_architecture_cli
是一个基于Clean Architecture生成文件夹和文件的命令行工具。此CLI还帮助你设置项目。
该包遵循的文件夹结构是基于功能文件夹类型。
要使用它,你应该执行以下步骤:
-
全局激活
pure_clean_architecture_cli
Dart CLI:dart pub global activate pure_clean_architecture_cli
-
确保你在正确的Flutter项目目录下,并在终端运行此命令:
dart pub global run pure_clean_architecture_cli
特性
此包帮助你设置项目并基于Clean Architecture创建功能文件夹和文件。
设置新的Flutter项目
在终端运行 dart pub global run pure_clean_architecture_cli
命令后,你需要选择1个选项。这将帮助在lib
文件夹内创建所需的文件,如路由、主题、扩展、资源、API等。
这是文件夹结构的示例:
lib
├── core
│ ├── api
│ │ └── api.dart
│ ├── assets
│ │ └── assets.dart
│ ├── constants
│ │ └── constants.dart
│ ├── errors
│ │ ├── exception.dart
│ │ └── failure.dart
│ ├── extension
│ │ └── extension.dart
│ ├── routes
│ │ └── routes.dart
│ ├── themes
│ │ └── themes.dart
│ ├── utils
│ │ └── usecase.dart
│ └── validator
│ └── validator.dart
└── main.dart
创建新的功能
在终端运行 dart pub global run pure_clean_architecture_cli
命令后,你需要选择2个选项。这将帮助根据Clean Architecture创建所需的文件夹和文件。相应的文件夹和文件将在features
文件夹内创建。
这是文件夹结构的示例:
lib
├── features
│ └── upload_file
│ ├── data
│ │ ├── datasource
│ │ │ ├── upload_file_local_datasource.dart
│ │ │ └── upload_file_remote_datasource.dart
│ │ ├── models
│ │ │ └── upload_file_model.dart
│ │ └── repository
│ │ └── upload_file_repository.dart
│ ├── domain
│ │ ├── entity
│ │ │ └── upload_file_entity.dart
│ │ ├── repository
│ │ │ └── upload_file_repository.dart
│ │ └── usecase
│ │ ├── add_upload_file_usecase.dart
│ │ ├── delete_upload_file_usecase.dart
│ │ ├── get_a_upload_file_usecase.dart
│ │ ├── get_all_upload_file_usecase.dart
│ │ └── update_upload_file_usecase.dart
│ └── presentation
│ ├── manager
│ │ ├── upload_file_bloc.dart
│ │ ├── upload_file_event.dart
│ │ └── upload_file_state.dart
│ ├── pages
│ │ └── upload_file_page.dart
│ └── widgets
└── main.dart
更多关于Flutter架构设计插件pure_clean_architecture_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter架构设计插件pure_clean_architecture_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter插件pure_clean_architecture_cli
的使用,这里是一个基本的代码案例,展示了如何使用该插件来设置和生成基于纯净清洁架构(Pure Clean Architecture)的Flutter项目结构。请注意,实际使用时可能需要根据具体需求进行调整。
首先,确保你已经全局安装了pure_clean_architecture_cli
。你可以通过Dart的包管理工具Pub进行安装:
dart pub global activate pure_clean_architecture_cli
安装完成后,你可以使用pca
命令来生成项目。以下是一个使用示例:
1. 创建新项目
在命令行中运行以下命令来创建一个新的Flutter项目,使用纯净清洁架构:
pca create my_clean_arch_project
这将创建一个名为my_clean_arch_project
的新目录,并在其中生成一个基于纯净清洁架构的Flutter项目。
2. 项目结构
生成的项目将具有如下结构(部分展示):
my_clean_arch_project/
├── lib/
│ ├── data/
│ │ ├── datasources/
│ │ ├── models/
│ │ ├── repositories/
│ ├── domain/
│ │ ├── entities/
│ │ ├── usecases/
│ ├── presentation/
│ │ ├── blocs/
│ │ ├── pages/
│ │ ├── widgets/
│ ├── app/
│ │ ├── app.dart
│ │ ├── main.dart
│ ├── dependencies.dart
├── pubspec.yaml
├── README.md
3. 修改和扩展代码
以下是如何在生成的项目结构中添加一个简单的用例(UseCase)和相应的UI页面。
添加UseCase
在lib/domain/usecases/
目录下创建一个新的Dart文件,例如get_user_usecase.dart
:
import 'package:dartz/dartz.dart';
import 'package:my_clean_arch_project/domain/entities/user.dart';
import 'package:my_clean_arch_project/domain/repositories/user_repository.dart';
class GetUserUseCase {
final UserRepository userRepository;
GetUserUseCase(this.userRepository);
Future<Either<Failure, User>> execute(String userId) async {
return await userRepository.getUser(userId);
}
}
创建Repository
在lib/data/repositories/
目录下创建一个新的Dart文件,例如user_repository.dart
:
import 'package:dartz/dartz.dart';
import 'package:my_clean_arch_project/data/datasources/user_datasource.dart';
import 'package:my_clean_arch_project/domain/entities/user.dart';
import 'package:my_clean_arch_project/domain/repositories/user_repository.dart';
class UserRepositoryImpl implements UserRepository {
final UserDataSource userDataSource;
UserRepositoryImpl(this.userDataSource);
@override
Future<Either<Failure, User>> getUser(String userId) async {
return await userDataSource.getUser(userId);
}
}
创建Data Source
在lib/data/datasources/
目录下创建一个新的Dart文件,例如user_datasource.dart
:
import 'package:dartz/dartz.dart';
import 'package:my_clean_arch_project/domain/entities/user.dart';
abstract class UserDataSource {
Future<Either<Failure, User>> getUser(String userId);
}
创建UI页面
在lib/presentation/pages/
目录下创建一个新的Dart文件,例如user_page.dart
:
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:my_clean_arch_project/app/app.dart';
import 'package:my_clean_arch_project/domain/entities/user.dart';
import 'package:my_clean_arch_project/presentation/blocs/user_bloc/user_bloc.dart';
class UserPage extends StatelessWidget {
const UserPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('User Page')),
body: BlocProvider<UserBloc>(
create: (context) => UserBloc(
getUserUseCase: context.read<GetUserUseCase>(),
)..add(GetUserEvent(userId: '1')),
child: BlocBuilder<UserBloc, UserState>(
builder: (context, state) {
if (state is UserLoading) {
return Center(child: CircularProgressIndicator());
} else if (state is UserLoaded) {
return ListTile(
leading: CircleAvatar(child: Text(state.user.name![0])),
title: Text(state.user.name!),
);
} else if (state is UserError) {
return Center(child: Text('Error: ${state.message}'));
}
return Container();
},
),
),
);
}
}
创建Bloc
在lib/presentation/blocs/user_bloc/
目录下创建相关的Bloc文件,例如user_bloc.dart
和user_event.dart
、user_state.dart
。
user_bloc.dart
:
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:my_clean_arch_project/domain/usecases/get_user_usecase.dart';
import 'package:my_clean_arch_project/presentation/blocs/user_bloc/user_event.dart';
import 'package:my_clean_arch_project/presentation/blocs/user_bloc/user_state.dart';
part 'user_bloc.g.dart';
class UserBloc extends Bloc<UserEvent, UserState> {
final GetUserUseCase getUserUseCase;
UserBloc({required this.getUserUseCase}) : super(UserInitial());
@override
Stream<UserState> mapEventToState(UserEvent event) async* {
if (event is GetUserEvent) {
yield UserLoading();
final result = await getUserUseCase.execute(event.userId);
yield result.fold(
(failure) => UserError(message: failure.message),
(user) => UserLoaded(user: user),
);
}
}
}
user_event.dart
:
part of 'user_bloc.dart';
@immutable
abstract class UserEvent extends Equatable {
const UserEvent();
}
class GetUserEvent extends UserEvent {
final String userId;
const GetUserEvent({required this.userId});
@override
List<Object?> get props => [userId];
}
user_state.dart
:
part of 'user_bloc.dart';
@immutable
abstract class UserState extends Equatable {
const UserState();
}
class UserInitial extends UserState {
const UserInitial();
@override
List<Object?> get props => [];
}
class UserLoading extends UserState {
const UserLoading();
@override
List<Object?> get props => [];
}
class UserLoaded extends UserState {
final User user;
const UserLoaded({required this.user});
@override
List<Object?> get props => [user];
}
class UserError extends UserState {
final String message;
const UserError({required this.message});
@override
List<Object?> get props => [message];
}
4. 运行项目
确保所有依赖项都已正确安装,然后在项目根目录下运行:
flutter run
这将启动Flutter应用程序,并显示你创建的UserPage
页面,根据UseCase加载用户数据。
请注意,这只是一个简单的示例,实际项目中可能需要处理更多的细节和错误情况。pure_clean_architecture_cli
插件的主要目的是提供一个良好的起点,帮助你快速搭建一个基于纯净清洁架构的Flutter项目。