Flutter - 如何使用主题更改 IconButtons 的大小

Posted

技术标签:

【中文标题】Flutter - 如何使用主题更改 IconButtons 的大小【英文标题】:Flutter - How to change IconButtons size with Theme 【发布时间】:2019-12-08 19:39:58 【问题描述】:

我有一个包含多个图标按钮的行,我需要更改它们的颜色和大小。 我设法更改了颜色,但无法更改图标大小。

IconTheme(
                  data: IconThemeData(size: 48.0, color: Colors.yellow),
                  child: Row(
                    mainAxisSize: MainAxisSize.max,
                    mainAxisAlignment: MainAxisAlignment.spaceAround,
                    children: <Widget>[
                      IconButton(
                        icon: Icon(Icons.delete),
                        onPressed: () => null,
                      ),
                      IconButton(
                        icon: Icon(Icons.file_upload),
                        onPressed: () => _addPhoto(false),
                      ),
                      IconButton(
                        icon: Icon(Icons.camera_alt),
                        onPressed: () => _addPhoto(true),
                      ),
                    ],
                  ),
                ),

如果我使用 iconSize 在 IconButtons 中设置大小,它可以工作,但使用 IconTheme 就不行。

我该如何解决?

【问题讨论】:

【参考方案1】:

首先,检查您是否在使用主要或默认主题的布局区域中。那是什么?放置在使用原色的布局上。

ThemeData(

  primaryColorLight: Colors.blueAccent[100],
  primaryColor: Colors.blueAccent[200],
  primaryColorDark: Colors.blueAccent[700],
  accentColor: Colors.yellow[700],

  iconTheme: IconThemeData(
    color: Colors.yellow[700],
      size: 28
  ),
  accentIconTheme: IconThemeData(
    color: Colors.yellow[700],
    size: 32
  ),
  primaryIconTheme: IconThemeData(
    color: Colors.yellow[700],
      size: 24
  ),
 
);
如果您位于主要区域(放置在使用主要颜色的布局上),则将使用 AccentIconTheme 否则主图标主题

IconTheme 我暂时不知道,所以任何人都可以随意编辑或发表评论

【讨论】:

【参考方案2】:

像这样使用iconThemeThemeData,您的所有图标都将是35 号,代码如下:

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      theme: ThemeData(
          iconTheme: IconThemeData(
            size: 35.0,
        ),
      ),
      home: HomePage(),
    );
  

【讨论】:

【参考方案3】:

图标按钮未选择主题中定义的图标大小。相反,我必须将图标包装在 iconThemeData 中的图标按钮内。

        icon: IconTheme(
          data: Theme.of(context).copyWith().iconTheme,
          child: Icon(
            Icons.search,
          ),
        ),
        onPressed: () ,
      ),

这解决了问题,但每次都为主题包装图标并不是一个好习惯。必须有一个适当的解决方案。

【讨论】:

【参考方案4】:

如官方文档中所定义,link here:

此属性不能为空。它默认为 24​​.0。此处给出的大小通过 IconTheme 传递给图标属性中的小部件。例如,在此处而不是在 Icon.size 属性中设置大小允许 IconButton 调整启动区域的大小以适合图标。如果您改为使用 Icon.size 设置图标的大小,则 IconButton 将默认为 24​​.0,然后图标本身可能会被剪裁。

因此,需要为 IconButton 赋予 iconSize 属性,因为它会覆盖 IconTheme 大小属性。如果您希望您的按钮具有从 IconTheme 派生的大小,那么您应该制作自定义 IconButton 来为您设置 iconSize。例如:

class CustomIconButton extends StatelessWidget 
  CustomIconButton(Key key, this.onPressed, this.icon);

  final Function onPressed;
  final Icon icon;

  @override
  Widget build(BuildContext context) 
    IconThemeData iconThemeData = IconTheme.of(context);
    return IconButton(
        onPressed: onPressed, iconSize: iconThemeData.size, icon: icon);
  

【讨论】:

以上是关于Flutter - 如何使用主题更改 IconButtons 的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中通过更改主题来更改文本颜色

如何在 Flutter 中更改整个主题的文本颜色?

Flutter 在主题中改变页面过渡速度/持续时间

Flutter 如何听设备暗色主题瞬间变化

如何在 Flutter 中设置按钮飞溅效果的边界?

Flutter - 如何更改 TextField 边框颜色?