Flutter图标按钮插件iconic_button的使用

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

Flutter图标按钮插件iconic_button的使用

iconic_button 是一个替代 Flutter ToggleButtons 的插件,支持模块化可选按钮的使用,而无需知道按钮的大小或分组。这些按钮专注于带有可选标签的图标,在芯片、扩展框和简单按钮中使用。此外,该包还提供了一个控制器来编程方式启用、禁用、选择或取消选择按钮,而无需调用 setState()

该插件使用 ButtonStylesMaterialStatesInkWell 来遵循 Material Design 主题,但非常可定制,并且基于 ElevatedButton

iconic_button 提供的功能:

  1. 可选标签的图标。图标本身很棒,但单独使用可能会令人困惑。内置工具提示。隐式动画。默认内置 MaterialInkWell 参数,使反应式设计更容易。
  2. 选择和禁用方法提供了直接、明确的按钮状态控制。
  3. 可重置属性:图标、标签和样式可以根据自定义事件进行更改。

此插件是我为其他项目中的需求构建的,现将其公开发布,以回馈社区。

使用

import 'package:iconic_button/iconic_button.dart';

// 创建一个控制器
final ButtonController controller = ButtonController();

// 使用控制器创建一个图标按钮
IconicButton(
  controller: controller,
  iconData: Icons.undo,
  onPressed: () {},
  label: 'Label',
)

// 通过控制器改变按钮的状态
controller.select(); // 选择按钮
controller.unSelect(); // 取消选择按钮
controller.enable(); // 启用按钮
controller.disable(); // 禁用按钮

// 记得在不再使用时释放控制器
controller.dispose();

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  iconic_button: ^x.x.x

然后运行 flutter pub get 命令。

示例代码

以下是一个完整的示例代码,展示了如何使用 iconic_button 插件创建不同类型的图标按钮。

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Iconic Button Demo',
      debugShowCheckedModeBanner: false,
      home: const MyHomePage(title: 'Iconic Button Package'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: const Center(
        child: SingleChildScrollView(
          clipBehavior: Clip.none,
          child: Padding(
            padding: EdgeInsets.symmetric(vertical: 16.0),
            child: Examples(),
          ),
        ),
      ),
    );
  }
}

class Examples extends StatelessWidget {
  const Examples({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const Column(
      children: [
        IconicButtonExample(),
        BasicExample(),
        ColorExample(),
        ChipExample(),
        CardExample(),
      ],
    );
  }
}

/// Example of [IconicButton]
class IconicButtonExample extends StatefulWidget {
  const IconicButtonExample({Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() => IconicButtonExampleState();
}

class IconicButtonExampleState extends State<IconicButtonExample> {
  final ButtonController _iconicController = ButtonController();

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            const ListTile(
              title: Text('IconicButton'),
              subtitle: Text('A toggle-like button that uses an icon and an optional label and customizable styling.'),
            ),
            Row(
              children: [
                IconicButton(
                  controller: _iconicController,
                  iconData: Icons.rocket_launch,
                  label: "Tap To Select",
                  onPressed: () {},
                ),
                Flexible(
                  child: IconicExampleSwitches(
                    iconicController: _iconicController,
                  ),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _iconicController.dispose();
    super.dispose();
  }
}

class IconicExampleSwitches extends StatelessWidget {
  final ButtonController iconicController;

  const IconicExampleSwitches({
    Key? key,
    required this.iconicController,
  }) : super(key: key);

  void _onSelectChanged(bool value) {
    if (value != iconicController.isSelected) {
      if (value) {
        iconicController.select();
      } else {
        iconicController.unSelect();
      }
    }
  }

  void _onEnableChanged(bool value) {
    if (value != iconicController.isEnabled) {
      if (value) {
        iconicController.enable();
      } else {
        iconicController.disable();
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return SetListenableBuilder(
      valueListenable: iconicController,
      builder: (context, set, _) {
        return Column(
          children: [
            SwitchListTile(
              value: set.contains(ButtonState.selected),
              onChanged: _onSelectChanged,
              title: const Text('Select/Unselect:'),
              dense: true,
            ),
            SwitchListTile(
              value: set.contains(ButtonState.enabled),
              onChanged: _onEnableChanged,
              title: const Text('Enable/Disable:'),
              dense: true,
            )
          ],
        );
      },
    );
  }
}

更多选项可以查看示例应用。

示例应用

要查看更多的选项,可以查看示例应用中的代码。示例代码位于:

// https://github.com/jwehrle/iconic_button/blob/main/example/lib/main.dart

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

1 回复

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


当然,以下是如何在Flutter中使用iconic_button插件的示例代码。请注意,iconic_button这个插件名可能是虚构的,因为Flutter的官方插件集合中并没有直接名为iconic_button的插件。不过,我们可以创建一个类似功能的自定义图标按钮来展示如何使用它。

假设我们要创建一个带有图标的按钮,并且点击图标时会触发某个事件。我们可以使用Flutter内置的IconButton来实现类似的功能,或者创建一个自定义的IconicButton小部件。

使用Flutter内置的IconButton

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('IconButton Example'),
        ),
        body: Center(
          child: IconButton(
            icon: Icon(Icons.star), // 设置图标
            color: Colors.blue, // 设置图标颜色
            onPressed: () {
              // 点击图标时触发的事件
              print('Icon button pressed!');
              // 你可以在这里添加其他逻辑,比如导航到另一个页面
            },
          ),
        ),
      ),
    );
  }
}

自定义IconicButton小部件

如果你确实需要一个自定义的IconicButton小部件,你可以通过继承StatelessWidgetStatefulWidget来创建它。以下是一个简单的例子:

import 'package:flutter/material.dart';

class IconicButton extends StatelessWidget {
  final IconData icon;
  final Color color;
  final VoidCallback onPressed;

  const IconicButton({
    Key? key,
    required this.icon,
    this.color = Colors.black,
    required this.onPressed,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return IconButton(
      icon: Icon(icon, color: color),
      onPressed: onPressed,
    );
  }
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Custom IconicButton Example'),
        ),
        body: Center(
          child: IconicButton(
            icon: Icons.star,
            color: Colors.blue,
            onPressed: () {
              print('Custom iconic button pressed!');
            },
          ),
        ),
      ),
    );
  }
}

在这个自定义IconicButton例子中,我们创建了一个新的小部件,它接受图标数据、颜色和一个点击回调作为参数,并在内部使用IconButton来渲染图标和处理点击事件。

以上代码展示了如何在Flutter中使用图标按钮,无论是使用内置的IconButton还是创建一个自定义的IconicButton小部件。希望这能帮助你理解如何在Flutter项目中实现图标按钮的功能。

回到顶部