Flutter图标选择插件icon_picker的使用

Flutter图标选择插件icon_picker的使用

介绍

icon_picker 是一个用于展示图标集合以供选择的 Flutter 小部件。该小部件扩展了 TextField,并且具有类似 TextFormField 的行为。

使用

在你的 Flutter 项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  ...
  icon_picker: "^2.1.0"

在你的库文件中添加以下导入语句:

import 'package:icon_picker/icon_picker.dart';

示例

IconPicker 默认使用内置的 MaterialIcon 集合,但你可以设置自己的图标集合。你只需要通过 iconCollection 参数传递一个 Map<String, IconData> 类型的对象。

final Map<String, IconData> myIconCollection = {
  'favorite': Icons.favorite,
  'home': Icons.home,
  'android': Icons.android,
  'album': Icons.album,
  'ac_unit': Icons.ac_unit,
  ...
}

使用 IconPicker 的示例代码如下:

IconPicker(
  initialValue: 'favorite', // 初始值
  icon: Icon(Icons.apps), // 图标
  labelText: "Icon", // 文本标签
  title: "Select an icon", // 标题
  cancelBtn: "CANCEL", // 取消按钮文本
  enableSearch: true, // 是否启用搜索功能
  searchHint: 'Search icon', // 搜索提示
  iconCollection: myIconCollection, // 自定义图标集合
  onChanged: (val) => print(val), // 改变时的回调
  onSaved: (val) => print(val), // 保存时的回调
);

当选择一个图标时,onChangedonSaved 回调函数的返回值是一个 JSON 字符串。例如,如果你选择了 ac_unit 图标,则返回值将是:

'{"iconName": "ac_unit", "codePoint": 60219, "fontFamily": "MaterialIcons"}'

要将 IconPicker 返回的字符串转换为 IconData,可以使用以下代码:

String value = '{"iconName": "ac_unit", "codePoint": 60219, "fontFamily": "MaterialIcons"}';
var iconDataJson = jsonDecode(value);
IconData icon = IconData(iconDataJson['codePoint'], fontFamily: iconDataJson['fontFamily']);
Icon(icon);

预览

预览

示例代码

以下是完整的示例代码:

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

void main() => runApp(MyApp());

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  GlobalKey<FormState> _oFormKey = GlobalKey<FormState>();
  TextEditingController? _controller;
  //String _initialValue = '';
  String _valueChanged = '';
  String _valueToValidate = '';
  String _valueSaved = '';

  [@override](/user/override)
  void initState() {
    super.initState();

    //_initialValue = 'home';
    _controller = TextEditingController(text: 'home');

    _getValue();
  }

  /// This implementation is just to simulate a load data behavior
  /// from a database SQLite or from an API
  Future<void> _getValue() async {
    await Future.delayed(const Duration(seconds: 3), () {
      setState(() {
        //_initialValue = 'favorite';
        _controller?.text = 'favorite';
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter IconPicker Demo'),
      ),
      body: SingleChildScrollView(
        padding: EdgeInsets.only(left: 20, right: 20, top: 10),
        child: Form(
          key: _oFormKey,
          child: Column(
            children: <Widget>[
              IconPicker(
                controller: _controller,
                //initialValue: _initialValue,
                icon: Icon(Icons.apps),
                labelText: "Icon",
                enableSearch: true,
                onChanged: (val) => setState(() => _valueChanged = val),
                validator: (val) {
                  setState(() => _valueToValidate = val ?? '');
                  return null;
                },
                onSaved: (val) => setState(() => _valueSaved = val ?? ''),
              ),
              SizedBox(height: 30),
              Text(
                'IconPicker data value onChanged:',
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
              SizedBox(height: 10),
              SelectableText(_valueChanged),
              SizedBox(height: 30),
              ElevatedButton(
                onPressed: () {
                  final loForm = _oFormKey.currentState;

                  if (loForm?.validate() == true) {
                    loForm?.save();
                  }
                },
                child: Text('Submit'),
              ),
              SizedBox(height: 30),
              Text(
                'IconPicker data value validator:',
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
              SizedBox(height: 10),
              SelectableText(_valueToValidate),
              SizedBox(height: 30),
              Text(
                'IconPicker data value onSaved:',
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
              SizedBox(height: 10),
              SelectableText(_valueSaved),
              SizedBox(height: 30),
              ElevatedButton(
                onPressed: () {
                  final loForm = _oFormKey.currentState;
                  loForm?.reset();

                  setState(() {
                    _valueChanged = '';
                    _valueToValidate = '';
                    _valueSaved = '';
                  });
                },
                child: Text('Reset'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


icon_picker 是 Flutter 中一个用于选择图标的插件。它允许用户从预定义的图标列表中选择一个图标,并将选中的图标返回给应用程序。这个插件通常用于需要用户选择图标的场景,比如设置应用的图标、选择类别图标等。

安装 icon_picker

首先,你需要在 pubspec.yaml 文件中添加 icon_picker 依赖:

dependencies:
  flutter:
    sdk: flutter
  icon_picker: ^1.0.0  # 请检查最新版本

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

使用 icon_picker

下面是一个简单的示例,展示如何在 Flutter 应用中使用 icon_picker

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

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

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

class IconPickerDemo extends StatefulWidget {
  @override
  _IconPickerDemoState createState() => _IconPickerDemoState();
}

class _IconPickerDemoState extends State<IconPickerDemo> {
  IconData? _selectedIcon;

  Future<void> _pickIcon() async {
    final IconData? icon = await showIconPicker(
      context: context,
      iconPackMode: IconPack.material, // 选择图标包,可以是 material 或 cupertino
    );

    if (icon != null) {
      setState(() {
        _selectedIcon = icon;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Icon Picker Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (_selectedIcon != null)
              Icon(
                _selectedIcon,
                size: 50,
                color: Colors.blue,
              )
            else
              Text('No icon selected'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickIcon,
              child: Text('Pick an Icon'),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. _pickIcon 方法: 这个方法使用 showIconPicker 函数来显示图标选择器对话框。用户可以从 Material 或 Cupertino 图标包中选择一个图标。

  2. IconData? _selectedIcon: 这是一个状态变量,用于存储用户选择的图标。

  3. showIconPicker: 这个函数显示一个对话框,允许用户从预定义的图标列表中选择一个图标。iconPackMode 参数可以设置为 IconPack.materialIconPack.cupertino,分别表示使用 Material 或 Cupertino 图标包。

  4. setState: 当用户选择了一个图标后,调用 setState 更新界面,显示选中的图标。

主题和自定义

你可以通过 iconColorbackgroundColor 等参数来自定义图标选择器的外观。

final IconData? icon = await showIconPicker(
  context: context,
  iconPackMode: IconPack.material,
  iconColor: Colors.red,
  backgroundColor: Colors.black,
);
回到顶部