Flutter图标使用插件material_icons_named的功能

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

Flutter图标使用插件 material_icons_named 的功能

目录

Live Example

您可以访问以下链接查看实时示例:

Introduction

material_icons_named 是一个库,它为所有基于 Material Design 的图标提供了从字符串到图标的自动映射。这些图标是从 Flutter 的 stable 分支自动生成的。

请注意,如果包含此库,则在为 Android 和 iOS 构建时,Flutter 会报错,提示无法进行树摇(tree shaking)。因此,您必须在构建命令中添加 --no-tree-shake-icons 标志。例如:

flutter build apk --release --no-tree-shake-icons

由于 Flutter 无法对图标进行树摇优化,仅 Material Icons 就可能为您的最终应用增加约 350KB 的体积。这还不包括其他无法被树摇掉的图标。

Usage

安装

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

dependencies:
  material_icons_named: ^latest_version

然后运行 flutter pub get 来安装该插件。

示例代码

下面是一个完整的示例,展示了如何使用 material_icons_named 插件来展示 Material Icons 并允许用户搜索和点击图标以查看详细信息。

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:material_icons_named/material_icons_named.dart';

void main() {
  runApp(const MaterialIconGalleryApp());
}

class MaterialIconGalleryApp extends StatelessWidget {
  const MaterialIconGalleryApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material Icons Gallery',
      theme: ThemeData.light().copyWith(
        iconTheme: const IconThemeData(
          color: Colors.black87,
          size: 36.0,
        ),
        textTheme: const TextTheme(
          bodyMedium: TextStyle(
            color: Colors.black87,
            fontSize: 16.0,
          ),
        ),
      ),
      home: const MaterialIconGalleryHome(),
    );
  }
}

class ExampleIcon {
  final IconData iconData;
  final String title;

  ExampleIcon(this.iconData, this.title);
}

class MaterialIconGalleryHome extends StatefulWidget {
  const MaterialIconGalleryHome({super.key});

  @override
  State<MaterialIconGalleryHome> createState() => MaterialIconGalleryHomeState();
}

class MaterialIconGalleryHomeState extends State<MaterialIconGalleryHome> {
  final List<ExampleIcon> icons = [];
  var _searchTerm = '';
  var _isSearching = false;

  @override
  void initState() {
    super.initState();

    for (var entry in materialIcons.entries) {
      icons.add(ExampleIcon(entry.value, entry.key));
    }
  }

  @override
  Widget build(BuildContext context) {
    final filteredIcons = icons.where((icon) =>
        _searchTerm.isEmpty ||
        icon.title.toLowerCase().contains(_searchTerm.toLowerCase())).toList();

    return Scaffold(
      appBar: _isSearching ? _searchBar(context) : _titleBar(),
      body: Scrollbar(
        thumbVisibility: kIsWeb,
        child: GridView.builder(
          itemCount: filteredIcons.length,
          gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
            maxCrossAxisExtent: 300,
          ),
          itemBuilder: (context, index) {
            final icon = filteredIcons[index];

            return InkWell(
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute<void>(
                    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: const EdgeInsets.only(top: 16.0),
                    child: Text(icon.title),
                  )
                ],
              ),
            );
          },
        ),
      ),
    );
  }

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

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

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

使用说明

  1. 导入插件:在 Dart 文件顶部导入 material_icons_named 插件。
  2. 获取图标数据:通过 materialIcons 映射表获取图标名称对应的 IconData
  3. 显示图标:将获取到的 IconData 传递给 Icon 小部件以显示图标。

例如:

Icon(materialIcons['wifi_tethering_outlined']),

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

1 回复

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


当然,以下是如何在Flutter项目中使用material_icons_named插件来显示图标的示例代码。material_icons_named插件允许你通过图标名称来引用Material Icons,而不是直接使用Unicode字符。

首先,确保你已经在pubspec.yaml文件中添加了material_icons_named依赖:

dependencies:
  flutter:
    sdk: flutter
  material_icons_named: ^5.0.0  # 请检查最新版本号

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

接下来,在你的Flutter项目中,你可以这样使用material_icons_named

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

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Material Icons Named Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Icon(MaterialIconsNamed.home, size: 50, color: Colors.blue),
            SizedBox(height: 20),
            Icon(MaterialIconsNamed.account_circle, size: 50, color: Colors.green),
            SizedBox(height: 20),
            Icon(MaterialIconsNamed.settings, size: 50, color: Colors.red),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们导入了material_icons_named包,并在MyHomePage中使用Icon组件显示了几个不同的图标。每个图标都是通过MaterialIconsNamed枚举来引用的,例如MaterialIconsNamed.homeMaterialIconsNamed.account_circleMaterialIconsNamed.settings

这种方法使得图标的使用更加直观和易于管理,尤其是当你需要在代码中引用多个图标时。

注意:确保你使用的material_icons_named版本与Flutter SDK兼容,并查看该插件的文档以获取最新的图标名称列表和用法指南。

回到顶部