Flutter:将按钮边缘与其他组件对齐

Posted

技术标签:

【中文标题】Flutter:将按钮边缘与其他组件对齐【英文标题】:Flutter: aligning buttons edge to edge to other components 【发布时间】:2020-04-02 03:56:26 【问题描述】:

我发现很难以一种视觉表现与其他小部件协调的方式来布局按钮,但它们的可触摸区域为用户的手指提供了额外的额外空间。

请看附图。

代码:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      home: Material(child: HomePage()),
    );
  


class HomePage extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: <Widget>[
            Container(
            color: Colors.yellow,
            padding: EdgeInsets.all(16),
            child: Column(
              children: <Widget>[
                Row(
                  children: <Widget>[
                    Text('Top Left'),
                    Spacer(),
                    Text('Top right')
                  ],
                ),
                Row(
                  children: <Widget>[
                    Text('Middle Left'),
                    Spacer(),
                    Text('Middle right')
                  ],
                ),
                Row(
                  children: <Widget>[
                    Text('Bottom Left'),
                    Spacer(),
                    Text('Bottom right')
                  ],
                ),
              ],
            ),
          ),
          Container(
            color: Colors.orange,
            padding: EdgeInsets.all(16),
            child: Column(
              children: <Widget>[
                Row(
                  children: <Widget>[
                    Text('Top Left'),
                    Spacer(),
                    FlatButton(
                      child: Text('Top right'),
                      onPressed: () ,
                    )
                  ],
                ),
                Row(
                  children: <Widget>[
                    Text('Middle Left'),
                    Spacer(),
                    Text('Middle right')
                  ],
                ),
                Row(
                  children: <Widget>[
                    IconButton(
                      icon: Icon(Icons.print),
                      onPressed: () ,
                      alignment: Alignment.bottomLeft,
                    ),
                    Spacer(),
                    Text('Bottom right')
                  ],
                ),
              ],
            ),
          ),
        ],
      ),
    );
  

“所有文本”小部件排列精美。但是当我添加交互式小部件时,它开始变得丑陋。

平面按钮的字体与文本相同。但它的可触摸区域正在扩大它。我知道materialTapTargetSize,但它缩小了可点击区域,该区域具有膨胀的尺寸,以便于点击它。有没有一种简单的方法可以将它完全呈现为“右上角”文本小部件并且仍然具有相同的可触摸区域?在这种情况下,可触摸区域应该进一步扩大到 16 像素的填充,因为我会将 Ink 链接到按钮周围。

IconButton 高于文本,但问题是它没有从文本开始的地方开始(左边缘)。即使我添加了alignment: Alignment.centerLeft,它也会稍微向左移动,但仍然不会与其他文本并排。最重要的是,在更改此对齐方式后,它不再位于 InkWell 的中心。

目前,我使用 Stack 和 Positioned 小部件解决了所有这些问题。通过这种方法,我可以准确控制项目的位置,并且 InkWell 将内容准确地保持在中心。但我认为这不是一个正确的解决方案。

感谢您的反馈。

【问题讨论】:

【参考方案1】:

试试这个代码,

对于扁平按钮:

Container(
   alignment: Alignment.centerRight,
   width: 60,
   child: FlatButton(
     padding: EdgeInsets.all(0),
     child: Text('Top right'),
     onPressed: () ,
   ),
)

图标按钮:

IconButton(
  padding: EdgeInsets.all(0),
  icon: Icon(Icons.print),
  onPressed: () ,
  alignment: Alignment.bottomLeft,
),

【讨论】:

我在原始帖子中提到我已经知道其中的一些技巧。扁平按钮看起来更好,但仍会垂直扩展内容,并且其可点击区域变小(更难点击)。选中时,图标按钮非常偏离中心。我在此处附上结果imgur.com/a/oTKb6KW(突出显示两个按钮的组合图像,我还使用了 MaterialTapTargetSize.shrinkWrap)。 使用容器,在该容器内,设置该子项的高度和宽度。它会起作用的。

以上是关于Flutter:将按钮边缘与其他组件对齐的主要内容,如果未能解决你的问题,请参考以下文章

将 div 与图像的右边缘对齐

如何将 2 个按钮与 UIToolbar 的左右边框对齐

Flutter——最详细的Row(横向)布局使用教程

Flutter——最详细的Row(横向)布局使用教程

如何在 Flutter 中对齐小部件内的按钮

将按钮图像对齐到UIButton的右边缘