Flutter图标生成插件fluttericon的使用

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

Flutter图标生成插件 fluttericon 的使用

fluttericon 是一个包含15种流行的免费和开源web字体图标的Flutter包。它主要用于开发过程中帮助识别和测试图标,不建议在生产环境中直接使用,因为它的体积较大。对于生产环境,推荐使用 FlutterIcon 来定制自己的图标集。

包含的图标集

以下是 fluttericon 包中包含的所有图标集:

  • Brandico
  • Elusive
  • Entypo
  • Font Awesome (4 和 5)
  • Fontelico
  • Iconic
  • Linearicons Free
  • Linecons
  • Maki
  • Meteocons
  • MfgLabs
  • ModernPictograms
  • Octicons
  • RPGAwesome
  • Typicons
  • WebSymbols
  • Zocial

请注意,每个字体集都有其版权信息,请尊重并遵守。

使用方法

只需导入所需的图标集并像平常一样使用 IconData 即可。以下是一个简单的示例:

import 'package:fluttericon/typicons_icons.dart';
import 'package:fluttericon/fontelico_icons.dart';
import 'package:fluttericon/linecons_icons.dart';

final myIcons = const <Widget>[
    const Icon(Typicons.attention),
    const Icon(Fontelico.emo_wink),
    const Icon(Linecons.globe),
];

示例 Demo

下面是一个完整的示例项目,展示了如何使用 fluttericon 包中的图标,并通过搜索功能来查找特定图标。

/* Thanks to font_awesome_flutter and @brianegan for this example gallery
* https://github.com/fluttercommunity/font_awesome_flutter/blob/master/example/lib/main.dart
*/

import 'package:flutter/material.dart';
import 'package:fluttericon/typicons_icons.dart';

// 假设 all_icons.dart 文件包含了所有可用的图标列表
import 'all_icons.dart'; // 这个文件需要你自己创建或从示例中获取

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

class FontAwesomeGalleryApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Font Awesome Flutter Gallery',
      theme: ThemeData.light().copyWith(
        iconTheme: IconThemeData(size: 36.0, color: Colors.black87),
        textTheme: TextTheme(
          bodyText2: TextStyle(fontSize: 16.0, color: Colors.black87),
        ),
      ),
      home: FontAwesomeGalleryHome(),
    );
  }
}

class FontAwesomeGalleryHome extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => FontAwesomeGalleryHomeState();
}

class FontAwesomeGalleryHomeState extends State<FontAwesomeGalleryHome> {
  var _searchTerm = "";
  var _isSearching = false;

  @override
  Widget build(BuildContext context) {
    final filteredIcons = allIcons
        .where((icon) =>
            _searchTerm.isEmpty ||
            icon.name.toLowerCase().contains(_searchTerm.toLowerCase()))
        .toList();
    final orientation = MediaQuery.of(context).orientation;

    return Scaffold(
      appBar: _isSearching ? _searchBar(context) : _titleBar(),
      body: GridView.builder(
        itemCount: filteredIcons.length,
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: orientation == Orientation.portrait ? 4 : 6,
        ),
        itemBuilder: (context, index) {
          final icon = filteredIcons[index];

          return InkWell(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute<Null>(
                  builder: (BuildContext context) {
                    return GestureDetector(
                      onTap: () {
                        Navigator.of(context).pop();
                      },
                      child: Container(
                        color: Colors.white,
                        alignment: Alignment.center,
                        child: Hero(
                          tag: icon,
                          child: Icon(
                            icon.iconData,
                            size: 100,
                          ),
                        ),
                      ),
                    );
                  },
                ),
              );
            },
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Hero(tag: icon, child: Icon(icon.iconData)),
                Container(
                  padding: EdgeInsets.only(top: 16.0),
                  child: Column(
                    children: <Widget>[
                      Text(icon.family),
                      Text(icon.name),
                    ],
                  ),
                ),
              ],
            ),
          );
        },
      ),
    );
  }

  AppBar _titleBar() {
    return AppBar(
      title: Text("Fluttericon Gallery"),
      actions: [
        IconButton(
            icon: Icon(Typicons.search),
            onPressed: () {
              ModalRoute.of(context)?.addLocalHistoryEntry(
                LocalHistoryEntry(
                  onRemove: () {
                    setState(() {
                      _searchTerm = "";
                      _isSearching = false;
                    });
                  },
                ),
              );

              setState(() {
                _isSearching = true;
              });
            })
      ],
    );
  }

  AppBar _searchBar(BuildContext context) {
    return AppBar(
      leading: IconButton(
        icon: Icon(Typicons.left_open),
        onPressed: () {
          setState(
            () {
              Navigator.pop(context);
              _isSearching = false;
              _searchTerm = "";
            },
          );
        },
      ),
      title: TextField(
        onChanged: (text) => setState(() => _searchTerm = text),
        autofocus: true,
        style: TextStyle(fontSize: 18.0),
        decoration: InputDecoration(border: InputBorder.none),
      ),
    );
  }
}

注意事项

  1. 生产环境:请不要直接在生产环境中使用 fluttericon 包,因为它包含了大量的图标,可能会导致应用体积过大。
  2. 自定义图标集:建议使用 FlutterIcon 来定制你的图标集,只选择你需要的图标并构建你自己的图标字体。

希望这个指南能帮助你在项目中更好地使用 fluttericon 插件!


更多关于Flutter图标生成插件fluttericon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图标生成插件fluttericon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用fluttericon插件来生成图标的详细步骤和代码示例。

步骤一:添加依赖

首先,你需要在你的pubspec.yaml文件中添加fluttericon的依赖。这个依赖实际上不是一个直接用于生成图标的库,而是一个工具,它帮助你将图标字体文件转换为Dart代码。然而,通常你会结合flutter_launcher_icons(用于生成应用图标)和实际的图标字体库(如Font Awesome、Material Icons等)一起使用。不过,为了说明目的,这里我们假设你已经有了图标字体文件。

dependencies:
  flutter:
    sdk: flutter
  # 其他依赖...

dev_dependencies:
  flutter_test:
    sdk: flutter
  # fluttericon 工具不会直接作为依赖添加,但你需要使用其命令行工具

步骤二:准备图标字体文件

你需要一个.ttf(TrueType字体)文件,该文件包含你想要在Flutter应用中使用的图标。你可以从各种图标库网站下载这些字体文件,例如Font Awesome、Material Icons等。

步骤三:使用fluttericon命令行工具

fluttericon提供了一个命令行工具来生成Dart代码。首先,你需要全局安装fluttericon CLI工具(如果还没有安装的话):

dart pub global activate fluttericon

然后,你需要创建一个配置文件(通常命名为iconfont.yaml),指定你的图标字体文件和其他选项。以下是一个示例配置文件:

flutter_icons:
  android: true
  ios: true
  image_path: "assets/icons/"  # 图标将被保存到这个目录(相对pubspec.yaml位置)
  custom_icons:
    - icon_font:
        font: "assets/fonts/MyIcons.ttf"  # 你的图标字体文件路径
        class_name: "MyIcons"  # 生成的Dart类名

接下来,运行fluttericon CLI工具:

fluttericon

这个命令将读取你的配置文件,并生成包含图标的Dart文件(通常命名为icon_font.dart),以及将图标资源复制到指定的assets/icons/目录。

步骤四:在Flutter项目中使用生成的图标

在你的Flutter项目中,你现在可以导入生成的icon_font.dart文件,并使用其中的图标。例如:

import 'package:your_app_name/icon_font.dart';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Icon Example'),
        ),
        body: Center(
          child: IconButton(
            icon: Icon(MyIcons.some_icon),  # 使用生成的图标
            onPressed: () {},
          ),
        ),
      ),
    );
  }
}

在这个例子中,MyIcons.some_icon是你从图标字体文件中选择的图标的引用。确保你已经在pubspec.yaml文件中正确配置了字体和图标资源路径:

flutter:
  assets:
    - assets/fonts/MyIcons.ttf
    - assets/icons/  # 如果fluttericon生成了额外的图标资源文件

总结

通过fluttericon命令行工具,你可以轻松地将图标字体文件转换为Flutter项目中可使用的Dart代码。这样,你就可以在你的Flutter应用中方便地引用和使用这些图标了。希望这个示例对你有帮助!

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!