Flutter架构设计插件pure_clean_architecture_cli的使用

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

Flutter架构设计插件pure_clean_architecture_cli的使用

pure_clean_architecture_cli 是一个基于Clean Architecture生成文件夹和文件的命令行工具。此CLI还帮助你设置项目。

该包遵循的文件夹结构是基于功能文件夹类型

要使用它,你应该执行以下步骤:

  1. 全局激活 pure_clean_architecture_cli Dart CLI:

    dart pub global activate pure_clean_architecture_cli
    
  2. 确保你在正确的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

1 回复

更多关于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.dartuser_event.dartuser_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项目。

回到顶部