Flutter自定义图标结构插件eticon_struct的使用

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

Flutter自定义图标结构插件eticon_struct的使用

安装到项目中

pubspec.yaml 文件中添加 eticon_struct 作为 dev_dependencies

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^1.0.0
  eticon_struct: ^1.0.0

项目结构

项目结构如下所示:

├── 📁 assets
│   ├── 📁 fonts
│   │   └── 📄 empty.ttf
│   ├── 📁 icons
│   │   └── 🖼 empty.png
│   └── 📁 images
│       └── 🖼 empty.png
└── 📁 lib
    ├── 📄 main.dart
    ├── 📁 models
    │   └── 📄 about_models.txt
    ├── 📁 project_utils
    │   ├── 📄 pj_colors.dart
    │   ├── 📄 pj_icons.dart
    │   └── 📄 pj_utils.dart
    ├── 📁 project_widgets
    │   ├── 📄 pj_appbar.dart
    │   ├── 📄 pj_text.dart
    │   └── 📄 pj_widgets.dart
    └── 📁 screens
        └── 📁 main_screen
            ├── 📁 cubit
            │   ├── 📄 cb_main_screen.dart
            │   └── 📄 st_main_screen.dart
            ├── 📄 main_screen.dart
            └── 📄 main_screen_provider.dart

创建项目结构

在创建一个新的 Flutter 项目后,通过终端执行以下命令来创建项目结构:

flutter pub run eticon_struct:create

这将创建以下内容:

  1. 项目工具。
  2. 全局小部件。
  3. 资源文件夹。
  4. 模型文件夹。
  5. 一个带有与之相连的 Cubit 的基本无状态屏幕。

此外,还会添加一些基本库到项目中:

  1. eticon_api
  2. get
  3. flutter_screenutil
  4. flutter_bloc
  5. flutter_svg
  6. get_storage
  7. intl
  8. sentry_flutter

如果你想创建一个没有 Cubit 的基础屏幕,可以使用特殊标志 --without-cubit

flutter pub run eticon_struct:create --without-cubit

如果你想创建一个基础的有状态屏幕,可以使用特殊标志 --stf

flutter pub run eticon_struct:create --stf

你也可以同时使用这两个标志:

flutter pub run eticon_struct:create --stf --without-cubit

在项目中创建新的屏幕

你可以使用特殊的命令来创建新的屏幕:

flutter pub run eticon_struct:screen --name=<file_name>

例如:

flutter pub run eticon_struct:screen --name=new

执行此命令后,将在项目中添加一个名为 new_screen 的新屏幕。

注意:

名称指定方式与 Dart 文件命名相同,即使用 _ 作为单词分隔符。不要在名称末尾添加 “screen”,因为创建屏幕时会自动添加!

类似于创建项目结构,你可以使用标志 --stf(创建有状态的小部件)和 --without-cubit(创建没有 Cubit 的屏幕)。

例如:

flutter pub run eticon_struct:screen --name=order_schedule --stf --without-cubit

创建不绑定到特定屏幕的新 Cubit

你可以创建不绑定到特定屏幕的新 Cubit:

flutter pub run eticon_struct:cubit --name=<file_name> --path=<your_path>

例如:

flutter pub run eticon_struct:cubit --name=my_cubit --path=project_utils

执行此命令后,将在 project_utils 目录下添加一个新的 Cubit:my_cubit

注意:

名称指定方式与 Dart 文件命名相同,即使用 _ 作为单词分隔符。path 是新 Cubit 将被创建的目录路径,需要考虑到 path 将被替换为以下行:lib /

创建单例

你可以使用以下命令创建单例:

flutter pub run eticon_struct:singleton --name=<file_name>

例如:

flutter pub run eticon_struct:singleton --name=my_settings

执行此命令后,将在 project_utils 目录下创建一个名为 singletons 的新目录,其中包含所有创建的单例。

创建的单例结果如下:

class SgMySettings {
  SgMySettings._();

  static SgMySettings instance = SgMySettings._();
  
  static int cnt = 0; // 一些变量 

  // 一些方法
  void inc(){
    cnt++;
  }
}

此类将自动添加到 project_utils.dart 中。

联系我们

如果你有任何问题或建议改进这个包,请通过电子邮件联系我们:main@eticon.ru


示例代码

示例代码:main.dart

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Empty example'),
      ),
      body: Center(
        child: Container(
          width: 150,
          height: 150,
          color: Colors.black,
        ),
      ),
    );
  }
}

更多关于Flutter自定义图标结构插件eticon_struct的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义图标结构插件eticon_struct的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用自定义图标结构插件 eticon_struct 的示例代码案例。这个示例假定你已经添加了 eticon_struct 插件到你的 pubspec.yaml 文件中,并且已经运行了 flutter pub get

1. 添加依赖

首先,确保你的 pubspec.yaml 文件中包含了 eticon_struct 依赖:

dependencies:
  flutter:
    sdk: flutter
  eticon_struct: ^最新版本号  # 替换为实际的最新版本号

2. 导入插件并定义图标数据

在你的 Dart 文件中,导入 eticon_struct 插件,并定义你的图标数据。这里我们假设你有一个简单的图标数据结构。

import 'package:flutter/material.dart';
import 'package:eticon_struct/eticon_struct.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Eticon Struct Example'),
        ),
        body: Center(
          child: CustomIconWidget(),
        ),
      ),
    );
  }
}

class CustomIconWidget extends StatelessWidget {
  // 定义图标路径数据
  final List<PathData> _iconPathData = [
    PathData(
      commands: [
        PathCommand.moveTo(50, 50),
        PathCommand.lineTo(100, 50),
        PathCommand.lineTo(75, 100),
        PathCommand.closePath(),
      ],
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      size: Size(100, 100),
      painter: EticonPainter(_iconPathData),
    );
  }
}

// 自定义图标绘制器
class EticonPainter extends CustomPainter {
  final List<PathData> pathData;

  EticonPainter(this.pathData);

  @override
  void paint(Canvas canvas, Size size) {
    final Paint paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.fill;

    for (var path in pathData) {
      final Path customPath = Path();
      for (var command in path.commands) {
        if (command is PathCommand.moveTo) {
          customPath.moveTo(command.x, command.y);
        } else if (command is PathCommand.lineTo) {
          customPath.lineTo(command.x, command.y);
        } else if (command is PathCommand.closePath) {
          customPath.close();
        }
      }
      canvas.drawPath(customPath, paint);
    }
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}

3. PathData 和 PathCommand 的定义

你可能需要定义 PathDataPathCommand 类来存储和表示你的图标路径数据。这些类通常在你的项目中自定义,或者你可以使用现有的库(如果 eticon_struct 提供了这些类)。为了简单起见,这里假设你有一个基本的实现:

abstract class PathCommand {
  void applyToPath(Path path);
}

class MoveTo implements PathCommand {
  final double x, y;

  MoveTo(this.x, this.y);

  @override
  void applyToPath(Path path) {
    path.moveTo(x, y);
  }
}

class LineTo implements PathCommand {
  final double x, y;

  LineTo(this.x, this.y);

  @override
  void applyToPath(Path path) {
    path.lineTo(x, y);
  }
}

class ClosePath implements PathCommand {
  @override
  void applyToPath(Path path) {
    path.close();
  }
}

class PathData {
  final List<PathCommand> commands;

  PathData({required this.commands});
}

注意

  • eticon_struct 插件的具体 API 可能有所不同,因此你需要查阅该插件的文档以获取准确的用法。
  • 上述代码示例是基于假设的 API 和数据结构。如果 eticon_struct 插件提供了不同的方式来定义和使用图标数据,请遵循插件的文档进行修改。
  • 如果 eticon_struct 插件包含内置的图标数据解析和绘制功能,你可能不需要手动定义 PathCommandPathData 类。

希望这个示例能帮助你理解如何在 Flutter 中使用 eticon_struct 插件来自定义图标结构。如果你有更具体的问题或需要进一步的帮助,请查阅该插件的官方文档或提出更详细的问题。

回到顶部