如何删除 Flutter IconButton 大填充?
How do I remove Flutter IconButton big padding?
我想要一排 IconButton,彼此相邻,但实际图标和 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: () {},
)
],
),
);
}
}
我想摆脱大部分浅蓝色 space,让我的图标在左侧更早开始,并且彼此靠得更近,但我找不到调整 IconButton 本身大小的方法.
我几乎可以肯定这个 space 是由按钮本身拍摄的,因为如果我将它们的对齐方式更改为 centerRight
和 centerLeft
它们看起来像这样:
缩小实际图标也无济于事,按钮仍然很大:
感谢帮助
与其说那里有一个填充物,不如说是。 IconButton 是一个 Material 设计小部件,它遵循可点击对象需要 at least 48px on each side. 的规范。您可以从任何 IDE 单击进入 IconButton 实现。
您也可以半简单地获取 icon_button.dart 源代码并制作您自己的不遵循 Material 设计规范的 IconButton,因为整个文件只是由其他小部件组成并且是只有 200 行,大部分是评论。
解决此问题的两种方法。
仍然使用 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 代替 IconButton,由 Shyju Madathil 推荐。
GestureDetector( onTap: () {}, child: Icon(Icons.volume_up) )
我在尝试在用户触摸屏幕的位置呈现图标时遇到了类似的问题。不幸的是,Icon
class 将您选择的图标包裹在 SizedBox
.
中
阅读一点图标 class 源代码,发现每个图标都可以被视为文本:
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 源代码非常平易近人,强烈建议深入挖掘!
要显示飞溅效果(波纹),请使用 InkResponse
:
InkResponse(
Icon(Icons.volume_up),
onTap: ...,
)
如果需要,更改图标大小或添加填充:
InkResponse(
child: Padding(
padding: ...,
child: Icon(Icons.volume_up, size: ...),
),
onTap: ...,
)
将 IconButton
包裹在一个容器中根本行不通,而是使用 ClipRRect 并添加一个带有 Inkwell 的 material 小部件,只需确保提供 ClipRRect
widget 足够的边框 Radius 。
ClipRRect(
borderRadius: BorderRadius.circular(50),
child : Material(
child : InkWell(
child : Padding(
padding : const EdgeInsets.all(5),
child : Icon(
Icons.favorite_border,
),
),
onTap : () {},
),
),
)
更好的解决方案是像这样使用 Transform.scale
:
Transform.scale(
scale: 0.5, // set your value here
child: IconButton(icon: Icon(Icons.smartphone), onPressed: () {}),
)
无需删除 IconButton 周围的填充,您可以简单地使用 Icon 并用 GestureDetector 或 InkWell 将其包装为
GestureDetector(
ontap:(){}
child:Icon(...)
);
如果您想要 ripple/Ink 飞溅效果,就像 IconButton 在点击时提供的那样,用 InkWell 包裹它
InkWell(
splashColor: Colors.red,
child:Icon(...)
ontap:(){}
)
虽然第二种方法中 Icon 上的 Ink 不会像 IconButton 那样准确,但您可能需要为此做一些自定义实现。
这是一个消除任何额外填充的解决方案,使用 InkWell
代替 IconButton
:
Widget backButtonContainer = InkWell(
child: Container(
child: const Icon(
Icons.arrow_upward,
color: Colors.white,
size: 35.0,
),
),
onTap: () {
Navigator.of(_context).pop();
});
只需将空 BoxConstrains
传递给 constraints
属性 并填充零。
IconButton(
padding: EdgeInsets.zero,
constraints: BoxConstraints(),
)
您必须传递空约束,因为默认情况下,IconButton 小部件假定最小尺寸为 48px。
您可以使用 ListTile,它会在适合您需要的文本和图标之间提供一个默认值 space
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),
),
我想要一排 IconButton,彼此相邻,但实际图标和 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: () {},
)
],
),
);
}
}
我想摆脱大部分浅蓝色 space,让我的图标在左侧更早开始,并且彼此靠得更近,但我找不到调整 IconButton 本身大小的方法.
我几乎可以肯定这个 space 是由按钮本身拍摄的,因为如果我将它们的对齐方式更改为 centerRight
和 centerLeft
它们看起来像这样:
缩小实际图标也无济于事,按钮仍然很大:
感谢帮助
与其说那里有一个填充物,不如说是。 IconButton 是一个 Material 设计小部件,它遵循可点击对象需要 at least 48px on each side. 的规范。您可以从任何 IDE 单击进入 IconButton 实现。
您也可以半简单地获取 icon_button.dart 源代码并制作您自己的不遵循 Material 设计规范的 IconButton,因为整个文件只是由其他小部件组成并且是只有 200 行,大部分是评论。
解决此问题的两种方法。
仍然使用 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 代替 IconButton,由 Shyju Madathil 推荐。
GestureDetector( onTap: () {}, child: Icon(Icons.volume_up) )
我在尝试在用户触摸屏幕的位置呈现图标时遇到了类似的问题。不幸的是,Icon
class 将您选择的图标包裹在 SizedBox
.
阅读一点图标 class 源代码,发现每个图标都可以被视为文本:
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 源代码非常平易近人,强烈建议深入挖掘!
要显示飞溅效果(波纹),请使用 InkResponse
:
InkResponse(
Icon(Icons.volume_up),
onTap: ...,
)
如果需要,更改图标大小或添加填充:
InkResponse(
child: Padding(
padding: ...,
child: Icon(Icons.volume_up, size: ...),
),
onTap: ...,
)
将 IconButton
包裹在一个容器中根本行不通,而是使用 ClipRRect 并添加一个带有 Inkwell 的 material 小部件,只需确保提供 ClipRRect
widget 足够的边框 Radius 。
ClipRRect(
borderRadius: BorderRadius.circular(50),
child : Material(
child : InkWell(
child : Padding(
padding : const EdgeInsets.all(5),
child : Icon(
Icons.favorite_border,
),
),
onTap : () {},
),
),
)
更好的解决方案是像这样使用 Transform.scale
:
Transform.scale(
scale: 0.5, // set your value here
child: IconButton(icon: Icon(Icons.smartphone), onPressed: () {}),
)
无需删除 IconButton 周围的填充,您可以简单地使用 Icon 并用 GestureDetector 或 InkWell 将其包装为
GestureDetector(
ontap:(){}
child:Icon(...)
);
如果您想要 ripple/Ink 飞溅效果,就像 IconButton 在点击时提供的那样,用 InkWell 包裹它
InkWell(
splashColor: Colors.red,
child:Icon(...)
ontap:(){}
)
虽然第二种方法中 Icon 上的 Ink 不会像 IconButton 那样准确,但您可能需要为此做一些自定义实现。
这是一个消除任何额外填充的解决方案,使用 InkWell
代替 IconButton
:
Widget backButtonContainer = InkWell(
child: Container(
child: const Icon(
Icons.arrow_upward,
color: Colors.white,
size: 35.0,
),
),
onTap: () {
Navigator.of(_context).pop();
});
只需将空 BoxConstrains
传递给 constraints
属性 并填充零。
IconButton(
padding: EdgeInsets.zero,
constraints: BoxConstraints(),
)
您必须传递空约束,因为默认情况下,IconButton 小部件假定最小尺寸为 48px。
您可以使用 ListTile,它会在适合您需要的文本和图标之间提供一个默认值 space
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),
),