如何在 Flutter 的 AppBar 中有可点击的文本

Posted

技术标签:

【中文标题】如何在 Flutter 的 AppBar 中有可点击的文本【英文标题】:How can I have clickable text in the AppBar in Flutter 【发布时间】:2019-03-13 19:01:21 【问题描述】:

我知道我可以在 Flutter 的 AppBar 的操作中使用 IconButton。但我希望用户看到的不是图标,而是“保存”或“返回”或“取消”字样,然后在 AppBar 中单击它们。我怎样才能做到这一点?这是我显示 AppBar 的代码的一部分。而不是保存图标,我想使用“保存”

return Scaffold(
    appBar: AppBar(
      leading: IconButton(icon: Icon(Icons.arrow_back),
      tooltip: "Cancel and Return to List",
      onPressed: () 
        Navigator.pop(context, true);
      ,
    ),
      automaticallyImplyLeading: false,
      title: Text(title),
      actions: <Widget>[

        IconButton(
          icon: Icon(Icons.save),
          tooltip: "Save Todo and Retrun to List",
          onPressed: () 
            save();
          ,
        )
      ],
    ),//AppBar

【问题讨论】:

你可以使用 FlatButton.icon(onPressed: ()save();, icon: Icon(Icons.save), label: 'Save');而不是 Iconbutton。 非常感谢!我实际上需要一个平面按钮。 但它对arrow_back不起作用 确切地说:在前导部分没有足够的空间来放置单词“取消”而不是箭头 对于那些想要图标而不是文本的人,请参阅How to add icon to AppBar in Flutter 【参考方案1】:

您可以在AppBaractions 列表中使用FlatButton

appBar: AppBar(
  title: Text("Test Screen"),
  actions: <Widget>[
    FlatButton(
      textColor: Colors.white,
      onPressed: () ,
      child: Text("Save"),
      shape: CircleBorder(side: BorderSide(color: Colors.transparent)),
    ),
  ],
),

onPressed 必须定义,否则按钮将显示为禁用。 另请注意,默认情况下,按钮的形状将为 InkWell 效果创建一个填充矩形。通过将shape 属性设置为CircleBorder,我们可以获得更好的按下状态效果。

例如

未按下:

按下:

【讨论】:

【参考方案2】:

使用TextButton

appBar: AppBar(
  actions: <Widget>[
    TextButton(
      onPressed: () ,
      child: Text('Save'),
    ),
  ],
)

【讨论】:

不要使用这种方式,因为你必须添加样式来修复位置 @TuGordoBello 更新了代码。感谢您指出,当时我没有意识到我使用的是一种普通的旧方法。 对1.22版本没有影响 @EricYuan 如果我没记错的话TextButton 是在 Flutter 2.0 之后添加的。【参考方案3】:

如果您有短字符串,那么您可以将Text 小部件代替Icon 传递到IconButton.icon 参数中:

IconButton(
  icon: Text(
    "Save",
    style: Theme.of(context).textTheme.button.apply(
      color: Theme.of(context).appBarTheme.actionsIconTheme.color,
    ),
  ),
  onPressed: _save,
),

很遗憾,它不适用于像 Cancel 这样较长的文本。

【讨论】:

这可行,但您必须更改图标大小。 IconButton(iconSize: 50, icon: Text("DONE"), ), 同意。默认情况下,它适用于大多数单个字母(例如 R、S),但不适用于像“m”这样较长的字母。【参考方案4】:

这是我第二次来这个帖子寻找解决方案。实际上,我对一些我觉得有趣的答案投了赞成票。

@sosite 解决方案几乎完美,更改iconSize 可以显示更长的文本。但是,它并不完美,因为按钮的飞溅半径会太大。

最好的方法是使用constraints: BoxConstraints(width: ...)。它将模仿默认 IconButton 的飞溅半径。

我们可以使用更大的文本,多世界的文本并将文本对齐到中心以完美对齐。

IconButton(
            constraints: BoxConstraints.expand(width: 80),
            icon: Text('CREATE GAME', textAlign: TextAlign.center),
            onPressed: () ,
          ),

如果文字被剪切,增加宽度值:)

【讨论】:

【参考方案5】:

您也可以通过在Center 小部件中使用GestureDetector 小部件来实现此目的

   Center(
      child: GestureDetector(
        onTap: (),
        child: Text(
          "Ssave",
          textScaleFactor: 1.5,
          style: TextStyle(
            fontSize: 12.0,
            color: Colors.white,
          ),
        ),
      ),
    )

【讨论】:

【参考方案6】:

关键是使用Center 包裹你的控件,并在控件最右边的时候给它右边一点空间。里面的东西都不重要。

AppBar(
      title: Text('The tile'),
      actions: [Center(
        child: Padding(
          padding: const EdgeInsets.fromLTRB(0,0,8,0),
          child: InkWell(
            onTap: (),
            child: Text(
              'Send',
              textScaleFactor: 1.5,
              style: TextStyle(
                color: Colors.white,
              ),
            ),
          ),
        ),
      )],
    ),

【讨论】:

【参考方案7】:

使用新版本Flutter 2.0

appBar: AppBar(
  title: Text("Test Screen"),
  actions: <Widget>[
    TextButton(
      textColor: Colors.white,
      onPressed: () ,
      child: Text("Save"),
      shape: CircleBorder(side: BorderSide(color: Colors.transparent)),
    ),
  ],
),

【讨论】:

以上是关于如何在 Flutter 的 AppBar 中有可点击的文本的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何仅在滚动后显示 AppBar?

如何在 Flutter 中使用 GestureDetector 隐藏 appBar?

我们如何在flutter中更改appbar背景颜色

如何在 Flutter 的 appbar 之外添加 endDrawer?

Flutter:如何从 appbar 动作中显示快餐栏

如何在 Flutter 中移除 AppBar for Android 上方的阴影?