Flutter图标选择器插件flutter_iconpicker_plus的使用

Flutter图标选择器插件flutter_iconpicker_plus的使用

ci 版本 平台

这个包提供了一个图标选择器,支持(或自定义提供)图标,可以通过一个AlertDialog来选择。所有图标都通过名称映射到IconData。这是为了使通过搜索来查找图标成为可能。全文搜索包括如果没有找到结果时的提示。

图标选择器

声明(重要)

此包定期维护,稳定且被许多生产软件解决方案使用(在此感谢所有人 🙏)。

然而,不能保证所有图标都能正确显示 -> 为什么? -> flutter框架不断更改例如codePoint的值,比如对于Icons.camera。所以如果你开发的应用使用的是较旧的flutter版本和flutter_iconpicker_plus版本,你就可以正常使用,但如果你想更新你的应用和flutter版本,codePoint的值可能会被破坏,不再与Icons.camera等匹配!

我们可以做什么?

简单地通过提供包含正确codePointIconData列表来使用自定义图标(而不是Icons.camera!)

好的:'camera': IconData(0xe3af, fontFamily: 'MaterialIcons')

不好:'camera': Icons.camera

例如,如果你想提供material图标,可以复制这里的实际图标:icons.dart,并将它们作为自定义图标传递给图标选择器。

支持的图标包

图标包 支持
Material
(包括Sharp, Rounded 和 Outlined)
Cupertino
FontAwesome
LineAwesome

使用

要使用此包,在pubspec.yaml文件中添加flutter_iconpicker_plus作为依赖项。

构建

如果你构建你的应用时遇到问题,可能是由于此包。#TreeShakeIcons

为了能够构建你的应用,添加以下标志到你的构建命令中:--no-tree-shake-icons,然后你应该可以正常构建了!

API参考

参数 类型 默认值 简短描述
context (仅需要) BuildContext - 由于AlertDialog的基础,因此需要此参数。
adaptiveDialog bool false 如果为true,图标选择器会根据屏幕大小进行调整。如果为false,图标选择器将显示在AlertDialog内。
barrierDismissible bool true 定义用户是否可以通过点击外部屏障来关闭对话框。
iconSize double 40.0 定义可选图标的所有图标的大小。
iconColor Color Theme.of(context).iconTheme.color 设置可选图标的所有图标的颜色。
mainAxisSpacing double 5.0 在主轴上放置子元素之间的空间量。
crossAxisSpacing double 5.0 在交叉轴上放置子元素之间的空间量。
iconPickerShape ShapeBorder RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)) 选择器对话框的形状。
backgroundColor Color Theme.of(context).dialogBackgroundColor AlertDialog的背景颜色。
constraints BoxConstraints 如果adaptiveDialogtrue,则默认为:BoxConstraints(maxHeight: 500, minWidth: 450, maxWidth: 720),否则:BoxConstraints(maxHeight: 350, minWidth: 450, maxWidth: 678) 对话框的BoxConstraints用于限制/设置:maxHeightmaxWidthminHeightminWidth
title Widget Text('Pick an icon') 选择器的标题。位于[搜索栏]和[图标]之上。
closeChild Widget Text('Close',textScaleFactor: 1.25,) 关闭默认对话框的AlertDialog的动作FlatButton的内容。
searchIcon Icon Icon(Icons.search) 设置[搜索栏]中的前缀图标。
searchHintText String 'Search' 设置[搜索栏]中TextFieldhintText
searchClearIcon Icon Icon(Icons.close) 设置[搜索栏]中的后缀图标。
noResultsText String 'No results for:' 当未找到搜索词的结果时显示的文本。
showTooltips bool false 显示在相应图标下方的标签。
showSearchBar bool true 如果为true,则在图标上方显示搜索栏。
iconPackModes List<IconPack> const <IconPack>[IconPack.material] 要显示的图标模式。
customIconPack Map<String, IconData> null 可以使用的自定义图标。

图标包模式

你可以通过参数iconPackModes选择所需的图标包。这默认为const <IconPack>[IconPack.material]。 更多用法请参阅示例。

自定义图标

如果你不想使用默认图标包,也可以通过创建一个Map<String, IconData>来提供自己的图标包,其中包含图标名称和特定的IconData。只需将其传递给customIconPack并设置图标包模式:IconPack.custom

图标选择器的结果和进一步使用(保存和检索)

选择器返回一个IconData,它只是一个类,例如:

IconData(0xe3af, fontFamily: 'MaterialIcons');    // Icons.camera

这就是代表一个Material图标。

所以如果你计划保存所选图标(如sqflite、firebase等),可以使用序列化方法:

  1. 调用此方法将所选IconData转换为Map
serializeIcon(iconData)
  1. 通过传递映射后的IconData来检索IconData
deserializeIcon(map)

示例

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

void main() {
  runApp(
    const MaterialApp(
      home: HomeScreen(),
    ),
  );
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  Icon? _icon;

  _pickIcon() async {
    IconData? icon = await FlutterIconPicker.showIconPicker(context,
        iconPackModes: [IconPack.cupertino]);

    _icon = Icon(icon);
    setState(() {});

    debugPrint('Picked Icon:  $icon');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _pickIcon,
              child: const Text('Open IconPicker'),
            ),
            const SizedBox(height: 10),
            AnimatedSwitcher(
              duration: const Duration(milliseconds: 300),
              child: _icon ?? Container(),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter图标选择器插件flutter_iconpicker_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_iconpicker_plus插件的一个基本示例。这个插件允许你在应用中提供一个图标选择器,让用户可以从一系列图标中选择一个。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_iconpicker_plus依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_iconpicker_plus: ^x.y.z  # 请将x.y.z替换为最新版本号

然后,运行flutter pub get来安装依赖。

步骤 2: 导入包

在你的Dart文件中(例如main.dart),导入flutter_iconpicker_plus包:

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

步骤 3: 使用IconPicker

以下是一个简单的示例,展示如何在你的应用中实现图标选择器:

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  IconPickerData? _selectedIcon;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Icon Picker Plus Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (_selectedIcon != null)
              Icon(
                IconData(
                  _selectedIcon!.codePoint,
                  fontFamily: _selectedIcon!.fontFamily,
                ),
                size: 50,
                color: Colors.blue,
              ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => IconPicker(
                      onDone: (icons) {
                        setState(() {
                          _selectedIcon = icons.first;
                        });
                        Navigator.pop(context);
                      },
                      icons: IconPickerData.allIcons(), // 获取所有图标
                      selectedIcons: _selectedIcon != null
                          ? [_selectedIcon!]
                          : [],
                      multiSelect: false, // 设置为true以允许多选
                      showSearchBar: true, // 显示搜索栏
                      searchBarPlaceholder: 'Search...',
                    ),
                  ),
                );
              },
              child: Text('Select Icon'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖导入:我们在pubspec.yaml中添加了flutter_iconpicker_plus依赖,并在Dart文件中导入了它。
  2. 状态管理:我们创建了一个_MyHomePageState类来管理选中图标的状态。
  3. UI布局
    • 使用CenterColumn来居中显示图标和按钮。
    • 如果已选中图标,则显示该图标。
    • 使用ElevatedButton来触发图标选择器。
  4. 图标选择器:点击按钮时,导航到一个新的IconPicker页面,用户可以选择一个图标。选择完成后,将更新状态并返回到主页面。

这个示例展示了如何使用flutter_iconpicker_plus插件的基本功能。你可以根据需要进行进一步自定义和扩展。

回到顶部