如何在flutter中将2个元素的行中仅一个元素居中

Baj*_*jji 9 flutter flutter-layout

在我的布局中,我连续有两个小部件,一个文本和一个图标。

如下所示,假定*表示图标,并使用“-”表示该行:

----------------------------
           Text          *  
----------------------------
Run Code Online (Sandbox Code Playgroud)

如何使我的文本居中于整行,图标位于右端?

And*_*eev 14

只需在左侧/右侧使用ExpandedSpacer小部件并将您的小部件放在Expanded

Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    Spacer(),
    Text('Text'),
    Expanded(
      child: Text('*'),
      ),
    ),
  ],
),
Run Code Online (Sandbox Code Playgroud)

结果: 在 Row 中以一个元素为中心颤动


Mar*_*łek 10

您需要注意的主要事情是,如果您不想使用Stack它,则应该在左右两侧提供相同的占用宽度的小部件。

我会做到这一点无论ExpandedPadding

Row(
  children: <Widget>[
    Expanded(
      child: Padding(
        padding: const EdgeInsets.only(left: 32.0),
        child: Text(
          "Text",
          textAlign: TextAlign.center,
        ),
      ),
    ),
    Icon(Icons.add, size: 32.0,)
  ],
)
Run Code Online (Sandbox Code Playgroud)

或具有RowmainAxisAlignment与一 Container

Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
  children: <Widget>[
    Container(width: 32.0, height: 0.0),
    Text("Text"),
    Icon(Icons.add, size: 32.0)
  ],
)
Run Code Online (Sandbox Code Playgroud)

或用ExpandedContainer在左侧而不是填充:)。考虑到Icon占用的空间,左侧的填充或额外容器使textAlign可以使文本真正位于行的中心。


Cop*_*oad 10

在此处输入图片说明

1. 使用Row(虽然不是很灵活)

Row(
  children: <Widget>[
    Expanded(child: Center(child: Text('Center'))),
    Text("#"),
  ],
)
Run Code Online (Sandbox Code Playgroud)

2.使用Stack(灵活)

Row(
  children: <Widget>[
    Expanded(child: Center(child: Text('Center'))),
    Text("#"),
  ],
)
Run Code Online (Sandbox Code Playgroud)

  • 这会将“中心”放置在中心左侧一点。 (7认同)
  • @Swift 将 `Row` 替换为 `Stack`,删除 `Expanded` 并将 `Text` 包装在 `Positioned(right: 0, child: Text("*")` 中 (2认同)

jon*_*jon 8

我发现有必要使用 aStack来让 Text 真正居中:

Column(
  mainAxisSize: MainAxisSize.min,
  crossAxisAlignment: CrossAxisAlignment.stretch,
  children: [
    Stack(
      alignment: Alignment.center,
      children: [
        Align(
          alignment: Alignment.center,
          child: Text('Text'),
        ),
        Align(
          alignment: Alignment.centerRight,
          child: Text('*'),
        )
      ],
    ),
  ],
);
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是,第一个“Align”在堆栈中没有考虑第二个“Align”(与“Row”相反)。因此这两个小部件可能会重叠...... (2认同)

Rom*_*mix 6

出于灵活性原因,我建议使用扩展小部件:

       Row(
            children: [
              Expanded(flex: 1, child: Container()),
              Expanded(
                flex: 8,
                child: Text('Your Text',
                  textAlign: TextAlign.center,
                ),
              ),
              Expanded(flex: 1, child: IconButton(...))
            ],
          )
Run Code Online (Sandbox Code Playgroud)