Flutter特征文件夹管理插件feature_folder_cli的使用

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

Flutter特征文件夹管理插件feature_folder_cli的使用

Folder by Feature CLI Utility 📂

feature_folder_cli 是一个Dart命令行工具,它根据“按功能组织文件夹”的模式生成文件夹结构。该工具帮助减少了设置模型、服务、仓库、屏幕和小部件目录所需的重复性工作。

通过使用 feature_folder_cli,你可以快速为你的Flutter项目创建一致且有组织的文件夹结构,从而提高代码的可维护性和可读性。下面是一个典型的文件夹结构示例:

feature/
┣ domain/
┃ ┣ models/
┃ ┣ repository/
┃ ┣ services/
┃ ┗ index.dart
┣ screens/
┃ ┣ feature_screen.dart
┃ ┗ index.dart
┣ widgets/
┃ ┣ feature_component.dart
┃ ┗ index.dart
┣ providers/
┃ ┣ feature_provider.dart
┃ ┗ index.dart
┗ index.dart

Command Usage 🔧

安装

首先,你需要安装 feature_folder_cli 插件。可以通过以下命令安装:

dart pub global activate feature_folder_cli

使用方法

确保你在项目的根目录下执行以下命令:

ff generate -n <feature_name> -t <type> -p <path>
  • -n--name: 指定要创建的功能名称。
  • -t--type: 指定要创建的模板类型(目前支持 simplegetx)。
  • -p--path: 指定要创建文件夹的路径,默认是当前目录下的 lib/features 文件夹。

示例

假设我们要为一个名为 user_profile 的功能创建文件夹结构,并使用 simple 模板类型,可以在项目根目录下运行以下命令:

ff generate -n user_profile -t simple

这将生成如下的文件夹结构:

lib/features/user_profile/
┣ domain/
┃ ┣ models/
┃ ┣ repository/
┃ ┣ services/
┃ ┗ index.dart
┣ screens/
┃ ┣ user_profile_screen.dart
┃ ┗ index.dart
┣ widgets/
┃ ┣ user_profile_component.dart
┃ ┗ index.dart
┣ providers/
┃ ┣ user_profile_provider.dart
┃ ┗ index.dart
┗ index.dart

完整示例Demo

为了更好地理解如何使用 feature_folder_cli,我们可以创建一个完整的示例项目。

1. 创建一个新的Flutter项目

flutter create my_app
cd my_app

2. 安装 feature_folder_cli

dart pub global activate feature_folder_cli

3. 生成用户配置文件功能文件夹

ff generate -n user_profile -t simple

4. 编写代码

在生成的文件夹结构中,我们可以开始编写代码。例如,在 user_profile_screen.dart 中添加一些简单的UI代码:

// lib/features/user_profile/screens/user_profile_screen.dart

import 'package:flutter/material.dart';

class UserProfileScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('User Profile')),
      body: Center(child: Text('This is the User Profile Screen')),
    );
  }
}

5. 导航到用户配置文件页面

在主应用程序文件中添加导航逻辑:

// lib/main.dart

import 'package:flutter/material.dart';
import 'package:my_app/features/user_profile/screens/user_profile_screen.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => UserProfileScreen()),
            );
          },
          child: Text('Go to User Profile'),
        ),
      ),
    );
  }
}

通过以上步骤,你已经成功使用 feature_folder_cli 创建了一个按功能组织的Flutter项目结构,并实现了基本的导航功能。希望这个指南能帮助你更好地管理和组织Flutter项目中的代码。


更多关于Flutter特征文件夹管理插件feature_folder_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter特征文件夹管理插件feature_folder_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter特征文件夹管理插件feature_folder_cli的代码案例和说明。请注意,feature_folder_cli是一个假设的插件名称,因为实际上Flutter社区中可能没有一个广泛认可的名为feature_folder_cli的官方插件专门用于特征文件夹管理。不过,我们可以模拟这样一个工具的功能,并通过一个示例脚本来展示如何管理Flutter项目中的特征文件夹。

在实际操作中,特征文件夹管理通常涉及创建、删除、重命名特征文件夹以及更新相关的Dart文件、路由等。这里,我们将使用一个简单的命令行工具(CLI)脚本来模拟这些操作。

假设的feature_folder_cli功能

  1. 创建特征文件夹:在lib/features目录下创建一个新的特征文件夹,并生成基本的Dart文件结构。
  2. 删除特征文件夹:从lib/features目录中删除指定的特征文件夹。
  3. 重命名特征文件夹:重命名指定的特征文件夹。

示例脚本(使用Dart编写CLI工具)

为了模拟feature_folder_cli,我们可以使用Dart编写一个简单的命令行工具。以下是一个基本的实现示例:

1. 创建项目结构

首先,创建一个Flutter项目并在项目根目录下创建一个tool文件夹来存放我们的CLI工具脚本。

flutter create my_flutter_app
cd my_flutter_app
mkdir tool
cd tool

2. 编写CLI工具脚本(feature_folder_cli.dart

tool文件夹中创建一个名为feature_folder_cli.dart的文件,并添加以下代码:

import 'dart:io';

void main(List<String> arguments) {
  if (arguments.isEmpty) {
    printUsage();
    exit(1);
  }

  String command = arguments.first;
  List<String> params = arguments.skip(1).toList();

  switch (command) {
    case 'create':
      if (params.length != 1) {
        printUsage('create');
        exit(1);
      }
      createFeatureFolder(params.first);
      break;
    case 'delete':
      if (params.length != 1) {
        printUsage('delete');
        exit(1);
      }
      deleteFeatureFolder(params.first);
      break;
    case 'rename':
      if (params.length != 2) {
        printUsage('rename');
        exit(1);
      }
      renameFeatureFolder(params.first, params.last);
      break;
    default:
      printUsage();
      exit(1);
  }
}

void printUsage([String subCommand = '']) {
  String usage = 'Usage: dart feature_folder_cli.dart <command> [arguments]\n'
      'Commands:\n'
      '  create <feature_name>   Create a new feature folder with the given name.\n'
      '  delete <feature_name>   Delete the feature folder with the given name.\n'
      '  rename <old_name> <new_name>  Rename the feature folder from <old_name> to <new_name>.\n';

  if (subCommand != '') {
    usage = 'Invalid arguments for command "$subCommand".\n$usage';
  }

  print(usage);
}

void createFeatureFolder(String featureName) {
  Directory featuresDir = Directory('lib/features');
  if (!featuresDir.existsSync()) {
    featuresDir.createSync(recursive: true);
  }

  Directory featureDir = Directory('${featuresDir.path}/$featureName');
  if (!featureDir.existsSync()) {
    featureDir.createSync(recursive: true);
    File featureFile = File('${featureDir.path}/$featureName_screen.dart');
    featureFile.writeAsStringSync('''
import 'package:flutter/material.dart';

class $featureNameScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('$featureName Screen'),
      ),
      body: Center(
        child: Text('Welcome to the $featureName Screen!'),
      ),
    );
  }
}
    ''');
    print('Feature folder "$featureName" created successfully.');
  } else {
    print('Feature folder "$featureName" already exists.');
  }
}

void deleteFeatureFolder(String featureName) {
  Directory featureDir = Directory('lib/features/$featureName');
  if (featureDir.existsSync()) {
    featureDir.deleteSync(recursive: true);
    print('Feature folder "$featureName" deleted successfully.');
  } else {
    print('Feature folder "$featureName" does not exist.');
  }
}

void renameFeatureFolder(String oldName, String newName) {
  Directory oldFeatureDir = Directory('lib/features/$oldName');
  if (oldFeatureDir.existsSync()) {
    Directory newFeatureDir = Directory('lib/features/$newName');
    if (!newFeatureDir.existsSync()) {
      oldFeatureDir.renameSync(newFeatureDir.path);
      print('Feature folder renamed from "$oldName" to "$newName" successfully.');
    } else {
      print('Feature folder "$newName" already exists.');
    }
  } else {
    print('Feature folder "$oldName" does not exist.');
  }
}

3. 运行CLI工具

在终端中,导航到tool目录并运行脚本:

cd path/to/my_flutter_app/tool
dart feature_folder_cli.dart create login
dart feature_folder_cli.dart delete login
dart feature_folder_cli.dart rename home dashboard

这个示例脚本模拟了一个简单的特征文件夹管理工具,可以根据命令创建、删除和重命名特征文件夹,并生成基本的Dart文件结构。当然,在实际项目中,你可能需要更复杂的逻辑来处理路由更新、依赖注入等。这个示例旨在提供一个基本的起点,帮助你理解如何使用Dart编写CLI工具来管理Flutter项目中的特征文件夹。

回到顶部