带有文本和图标的圆形按钮

Posted

技术标签:

【中文标题】带有文本和图标的圆形按钮【英文标题】:Round button with text and icon in flutter 【发布时间】:2018-09-01 16:37:48 【问题描述】:

如何为flutter 设置一个带有文本和图标的按钮?

我想要一个button,它看起来像带有文本的图标,可以放在屏幕底部

例如,图标在这里:android-button-with-icon-and-text

【问题讨论】:

【参考方案1】:

编辑 1: 在 Flutter 1.20 版本中,Flutter 团队进行了重大更改,引入了新按钮。因此,不推荐使用下面提到的按钮类型。使用TextButton 代替FlatButton 和ElevatedButton 代替RaisedButton。

TextButton.icon(onPressed: null, icon: null, label: null);
Elevated.icon(onPressed: null, icon: null, label: null);

查看按钮及其主题的重大更改here

注意:FlatButton 和 RaisedButton 已弃用

您可以简单地使用命名构造函数来创建不同类型的带有图标的按钮。比如

FlatButton.icon(onPressed: null, icon: null, label: null);
RaisedButton.icon(onPressed: null, icon: null, label: null);

但是,如果您有特定要求,那么您始终可以创建具有不同布局的自定义按钮,或者只需将小部件包装在 GestureDetector 中。

【讨论】:

我们可以用标签做这个后缀图标吗? 因为icon和label只是小部件,所以可以切换icon和label来将icon向右移动:RaisedButton.icon(onPressed: null, icon: Text('Button'), label: Icon (Icons.cached)), 那么将图标移到顶部或底部呢? 自定义这个可以参考TextButton.icon()的源码,具体是text_button.dart第462行的build函数【参考方案2】:

您可以通过使用包含Column(用于在图标下方显示文本)或Row(用于图标旁边的文本)的FlatButton,然后使用Icon 小部件来实现此目的和一个 Text 小部件作为子级。

这是一个例子:

class MyPage extends StatelessWidget 

  @override
  Widget build(BuildContext context) =>
      Scaffold(
        appBar: AppBar(
          title: Text("Hello world"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              FlatButton(
                onPressed: () => ,
                color: Colors.orange,
                padding: EdgeInsets.all(10.0),
                child: Column( // Replace with a Row for horizontal icon + text
                  children: <Widget>[
                    Icon(Icons.add),
                    Text("Add")
                  ],
                ),
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () => ,
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      );

这将产生以下内容:

【讨论】:

FlatButton id 现已弃用。【参考方案3】:

截图:

SizedBox.fromSize(
  size: Size(56, 56), // button width and height
  child: ClipOval(
    child: Material(
      color: Colors.orange, // button color
      child: InkWell(
        splashColor: Colors.green, // splash color
        onTap: () , // button pressed
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Icon(Icons.call), // icon
            Text("Call"), // text
          ],
        ),
      ),
    ),
  ),
)

【讨论】:

【参考方案4】:

在 Button 子项中使用 Column 或 Row,Row 用于水平按钮,Column 用于垂直,并且不要忘记 包含您需要的大小:

Container(
  width: 120.0,
  height: 30.0,
  child: RaisedButton(
    color: Color(0XFFFF0000),
    child: Row(
      children: <Widget>[
        Text('Play this song', style: TextStyle(color: Colors.white),),
        Icon(Icons.play_arrow, color: Colors.white,),
      ],
    ),
  ),
),

【讨论】:

感谢您的回答。在 RaisedButton 中添加新行是将文本和图标放在一起的正确解决方案。 这是最好的答案。在尝试实现自定义布局时,使用 .icon() 构造函数会对布局施加太多约束。【参考方案5】:

如果你需要这样的按钮:

您可以使用RaisedButton 并使用子属性来执行此操作。您需要添加一个 Row 和行内,您可以添加一个 Text 小部件和一个 Icon 小部件来实现此目的。如果你想使用 png 图像,你可以使用类似的小部件来实现这一点。

RaisedButton(
    onPressed: () ,
    color: Theme.of(context).accentColor,
    child: Padding(
      padding: EdgeInsets.fromLTRB(
          SizeConfig.safeBlockHorizontal * 5,
          0,
          SizeConfig.safeBlockHorizontal * 5,
          0),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: <Widget>[
          Text(
            'Continue',
            style: TextStyle(
              fontSize: 20,
              fontWeight: FontWeight.w700,
              color: Colors.white,
            ),
          ),
          Icon(
            Icons.arrow_forward,
            color: Colors.white,
          )
        ],
      ),
    ),
  ),

【讨论】:

【参考方案6】:

我通常的做法是在 Raised 按钮中嵌入一个 Row:

class Sendbutton extends StatelessWidget 
      @override
      Widget build(BuildContext context) 
        return RaisedButton(
          onPressed: () ,
          color: Colors.black,
          textColor: Colors.white,
          child: Row(
            children: <Widget>[
              Text('Send'),
              Icon(Icons.send)
            ],
          ),

        );
      
    

【讨论】:

RaisedButton 已弃用。请改用 ElevatedButton。【参考方案7】:

你可以这样做,

RaisedButton.icon( elevation: 4.0,
                    icon: Image.asset('images/image_upload.png' ,width: 20,height: 20,) ,
                      color: Theme.of(context).primaryColor,
                    onPressed: getImage,
                    label: Text("Add Team Image",style: TextStyle(
                        color: Colors.white, fontSize: 16.0))
                  ),

【讨论】:

【参考方案8】:

FlatButton、RaisedButton 和 OutlineButton 小部件已分别替换为 TextButton、ElevatedButton 和 OutlinedButton。

只需将此代码作为按钮放在下面。接受的答案也在 2021 年 9 月更新。

TextButton.icon(
    style: TextButton.styleFrom(
      textStyle: TextStyle(color: Colors.blue),
      backgroundColor: Colors.white,
      shape:RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(24.0),
      ), 
    ),
    onPressed: () => ,
    icon: Icon(Icons.send_rounded,),
    label: Text('Contact me',),
  ),

【讨论】:

【参考方案9】:

恭喜前面的答案...但我意识到如果图标在一行中(比如上图所示的三个图标),您需要使用列和行。

这里是代码

 Column(
        crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  FlatButton(
                      onPressed: () ,
                      child: Icon(
                        Icons.call,
                      )),
                  FlatButton(
                      onPressed: () ,
                      child: Icon(
                        Icons.message,
                      )),
                  FlatButton(
                      onPressed: () ,
                      child: Icon(
                        Icons.block,
                        color: Colors.red,
                      )),
                ],
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: <Widget>[
                  Text(
                    '   Call',
                  ),
                  Text(
                    'Message',
                  ),
                  Text(
                    'Block',
                    style: TextStyle(letterSpacing: 2.0, color: Colors.red),
                  ),
                ],
              ),
            ],
          ),

Here is the result

【讨论】:

【参考方案10】:

在最新版本的 Flutter 中,我认为您可以像这样使用 Just IconButton Widget:

@override
Widget build(BuildContext context) 
  return Column(
    mainAxisSize: MainAxisSize.min,
    children: <Widget>[
      IconButton(
        icon: const Icon(Icons.volume_up),
        onPressed: () ,
      ),
      Text('Volume')
    ],
  );

希望对您有所帮助,请通过此documentation 了解更多信息。

【讨论】:

【参考方案11】:

如果你需要文本居中,图像在旁边,像这样:

然后你可以用这个小部件树来实现它:

RaisedButton(
  onPressed: () ,
  child: Row(
    mainAxisAlignment: MainAxisAlignment.spaceBetween,
    children: <Widget>[
      Expanded(child: Text(
        'Push it! '*10,
        textAlign: TextAlign.center,
      ),),
      Image.network(
        'https://picsum.photos/250?image=9',
      ),
    ],
  ),
),

Full example available on my dartpad.dev (link).

【讨论】:

【参考方案12】:

颤振 2.4:

最好的推荐方法是使用 ShapeDecoration

这是一个使用 Inkwell 的示例(模拟按钮,但您可以使用按钮代替并获得相同的结果)。

InkWell(          
      onTap: (),
      child: Container(        
               width: 50,
               height: 50,
               decoration: ShapeDecoration(
                             shape: CircleBorder(), //here we set the circular figure
                             color: Colors.red
                           ),
                         child: Center(
                              child: Icon(
                                     Icons.email,
                                     size: 30,
                                      color: Colors.white,
                                      )
                            ),
                        )
)

这些是 ShapeDecoration 中可能的形状:

RoundedRectangleBorder(),
BeveledRectangleBorder(),
ContinuousRectangleBorder(),
CircleBorder(), 

结果链接示例:https://images.vexels.com/media/users/3/140138/isolated/preview/88e50689fa3280c748d000aaf0bad480-icono-de-ronda-de-correo-electronico-1.png

【讨论】:

以上是关于带有文本和图标的圆形按钮的主要内容,如果未能解决你的问题,请参考以下文章

通过单击按钮交替更改圆形按钮背景和文本

带有文本上方和下方图标的按钮

带有图标和文本的 Android 按钮

带有左图标和文本的按钮完全对齐

带有图标的按钮中文本的垂直对齐方式不正确

如何将svg图标添加到带有文本的按钮