69

我想要一排 IconButtons,彼此相邻,但实际图标和 IconButton 限制之间似乎有相当大的填充。我已经将按钮上的填充设置为 0。

这是我的组件,非常简单:

class ActionButtons extends StatelessWidget {
  @override
    Widget build(BuildContext context) {
      return Container(
        color: Colors.lightBlue,
        margin: const EdgeInsets.all(0.0),
        padding: const EdgeInsets.all(0.0),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            IconButton(
              icon: new Icon(ScanrIcons.reg),
              alignment: Alignment.center,
              padding: new EdgeInsets.all(0.0),
              onPressed: () {},
            ),
            IconButton(
              icon: new Icon(Icons.volume_up),
              alignment: Alignment.center,
              padding: new EdgeInsets.all(0.0),
              onPressed: () {},
            )
          ],
        ),
      );
    }
}

在此处输入图像描述

我想摆脱大部分浅蓝色空间,让我的图标在左侧更早开始,并且彼此靠近,但我找不到调整 IconButton 本身大小的方法。

我几乎可以肯定这个空间是由按钮本身占用的,因为如果我将它们的对齐方式更改为centerRight它们centerLeft看起来像这样:

在此处输入图像描述

缩小实际图标也无济于事,按钮仍然很大:

在此处输入图像描述

谢谢您的帮助

4

11 回答 11

148

只需将空值传递BoxConstrainsconstraints属性并填充零。

IconButton(
    padding: EdgeInsets.zero,
    constraints: BoxConstraints(),
)

您必须传递空约束,因为默认情况下,IconButton 小部件假定最小尺寸为 48 像素。

于 2020-07-27T03:28:46.833 回答
86

解决此问题的两种方法。

仍然使用 IconButton

将 IconButton 包裹在具有宽度的 Container 内。

例如:

Container(
  padding: const EdgeInsets.all(0.0),
  width: 30.0, // you can adjust the width as you need
  child: IconButton(
  ),
),

使用 GestureDetector 代替 IconButton

您也可以使用 GestureDetector 代替 Shyju Madathil 推荐的 IconButton。

GestureDetector( onTap: () {}, child: Icon(Icons.volume_up) ) 
于 2019-05-06T08:54:54.870 回答
21

那里没有填充物。IconButton 是一个 Material Design 小部件,它遵循可点击对象每边至少 48px 的规范。您可以从任何 IDE 中单击进入 IconButton 实现。

您还可以轻松获取 icon_button.dart 源代码并制作自己的 IconButton,它不遵循 Material Design 规范,因为整个文件只是组成其他小部件并且只有 200 行,其中大部分是注释。

于 2018-05-18T02:50:59.840 回答
7

将 包装IconButton在容器中根本行不通,而是使用ClipRRect并添加带有 Inkwell 的材质小部件,只需确保为ClipRRect小部件提供足够的边框 Radius 。

ClipRRect(
    borderRadius: BorderRadius.circular(50),
    child : Material(
        child : InkWell(
            child : Padding(
                padding : const EdgeInsets.all(5),
                child : Icon(
                    Icons.favorite_border,
                    ),
                ),
            onTap : () {},
            ),
        ),
    )
于 2019-11-22T13:29:28.787 回答
3

这是摆脱任何额外填充的解决方案,使用InkWell代替IconButton

Widget backButtonContainer = InkWell(
    child: Container(
      child: const Icon(
        Icons.arrow_upward,
        color: Colors.white,
        size: 35.0,
      ),
    ),
    onTap: () {
      Navigator.of(_context).pop();
    });
于 2020-05-19T20:03:11.797 回答
2

您可以简单地使用 Icon 并用 GestureDetector 或 InkWell 包装它,而不是删除 IconButton 周围的填充

GestureDetector(
   ontap:(){}
   child:Icon(...)
);

如果您想要图标按钮在单击时提供的波纹/墨水飞溅效果,请使用 InkWell 包装它

InkWell(
   splashColor: Colors.red,
   child:Icon(...)
   ontap:(){}
)

尽管在第二种方法中在 Icon 上抛出的 Ink 不会像 IconButton 那样准确,但您可能需要为此进行一些自定义实现。

于 2020-03-28T11:38:52.253 回答
0

我在尝试在用户触摸屏幕的位置渲染图标时遇到了类似的问题。不幸的是,Icon该类将您选择的图标包装在SizedBox.

阅读一点 Icon 类源代码,发现每个 Icon 都可以被视为文本:

Widget iconWidget = RichText(
      overflow: TextOverflow.visible,
      textDirection: textDirection,
      text: TextSpan(
        text: String.fromCharCode(icon.codePoint),
        style: TextStyle(
          inherit: false,
          color: iconColor,
          fontSize: iconSize,
          fontFamily: icon.fontFamily,
          package: icon.fontPackage,
        ),
      ),
    );

因此,例如,如果我想渲染Icons.details以指示我的用户刚刚指向的位置,没有任何边距,我可以执行以下操作:

Widget _pointer = Text(
      String.fromCharCode(Icons.details.codePoint),
      style: TextStyle(
        fontFamily: Icons.details.fontFamily,
        package: Icons.details.fontPackage,
        fontSize: 24.0,
        color: Colors.black
      ),
    );

Dart/Flutter 源代码非常平易近人,我强烈建议您深入研究一下!

于 2019-08-28T14:35:52.960 回答
0

您可以使用 ListTile 它为您提供适合您需要的文本和图标之间的默认空间

ListTile(
         leading: Icon(Icons.add), //Here Is The Icon You Want To Use
         title: Text('GFG title',textScaleFactor: 1.5,), //Here Is The Text Also
         trailing: Icon(Icons.done),
         ),
于 2020-12-12T14:02:35.060 回答
0

更好的解决方案是这样使用Transform.scale

 Transform.scale(
   scale: 0.5, // set your value here
   child: IconButton(icon: Icon(Icons.smartphone), onPressed: () {}),
 )
于 2020-02-29T11:19:39.747 回答
-1
 GestureDetector(
   onTap: () {
    Navigator.pop(context);
     },
    child: const Icon(Icons.arrow_back_ios),
  ),
于 2022-02-19T13:07:04.867 回答
-5

要显示飞溅效果(波纹),请使用InkResponse

InkResponse(
  Icon(Icons.volume_up),
  onTap: ...,
)

如果需要,更改图标大小或添加填充:

InkResponse(
  child: Padding(
    padding: ...,
    child: Icon(Icons.volume_up, size: ...),
  ),
  onTap: ...,
)
于 2019-09-06T11:41:32.050 回答