【问题标题】:How to align single widgets in Flutter?如何在 Flutter 中对齐单个小部件?
【发布时间】:2019-05-11 23:55:20
【问题描述】:

我想在其父级内对齐 Flutter 小部件。我知道我可以通过将一个小部件包装在一个中心小部件中来居中它。

  Center(
    child: Text("widget"),
  )

但是如何将其对齐到右侧、底部、顶部中间等?

注意事项:

我说的是单个孩子,而不是行或列中的多个孩子。请参阅这些 SO 问题:

这个问题是正确的,但我想提出一个更规范的问题:

【问题讨论】:

    标签: flutter dart alignment text-align


    【解决方案1】:

    如何对齐小部件

    要在其父窗口中对齐子窗口小部件,您可以使用Align 窗口小部件。如果您知道如何使用 Center 小部件,那么您就是正确的轨道,因为 Center 只是 Align 的一个特例。

    用 Align 小部件包装您希望对齐的小部件并设置其对齐属性。例如,这会将文本小部件与父小部件的右中对齐。

    Align(
      alignment: Alignment.centerRight,
      child: Text("widget"),
    )
    

    其他选项是

    • Alignment.topLeft
    • Alignment.topCenter
    • Alignment.topRight
    • Alignment.centerLeft
    • Alignment.center
    • Alignment.centerRight
    • Alignment.bottomLeft
    • Alignment.bottomCenter
    • Alignment.bottomRight

    看起来是这样的:

    您不仅限于这些位置。您可以在任何地方对齐小部件。通过指定 x,y 对,其中 (0,0) 是视图的中心,边缘是 1.0 围绕它的单位。也许一张图片会有所帮助:

    任何相对位置的位置(x,y)

    • Alignment.topLeftAlignment(-1.0, -1.0)
    • Alignment.topCenterAlignment(0.0, -1.0)
    • Alignment.topRightAlignment(1.0, -1.0)
    • Alignment.centerLeftAlignment(-1.0, 0.0)
    • Alignment.centerAlignment(0.0, 0.0)
    • Alignment.centerRightAlignment(1.0, 0.0)
    • Alignment.bottomLeftAlignment(-1.0, 1.0)
    • Alignment.bottomCenterAlignment(0.0, 1.0)
    • Alignment.bottomRightAlignment(1.0, 1.0)

    注意图像中的对齐(x,y) 不需要在[-1, +1] 范围内。对齐(1,2) 意味着它位于小部件的右侧,并且在小部件的下方再次与其高度一样多。

    这是自定义对齐位置的示例。

    Align(
      alignment: Alignment(0.7, -0.5),
      child: Text("widget"),
    )
    

    补充代码

    这是用于制作上述示例的main.dart 代码,方便您进行剪切和粘贴。

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(),
            body: myLayoutWidget(),
          ),
        );
      }
    }
    
    Widget myLayoutWidget() {
      return Align(
        alignment: Alignment(0.7, -0.5),
        child: Text(
          "widget",
          style: TextStyle(fontSize: 30),
        ),
      );
    }
    

    【讨论】:

      【解决方案2】:
        Expanded(
          child: Align(
            alignment: Alignment.centerRight,
            child: Text("widget"),
          ),
        )
      

      【讨论】:

      • 我还没试过这个。 Expanded 小部件在这里有什么作用?
      • Expanded 将填满所有可用空间(并使任何同级小部件占用更少空间)。它会将孩子放置在新创建空间的中心,如果您不希望它位于(扩展空间的)中心,则需要使用Align
      • 这仅适用于您的父母是ColumnRow
      • @CopsOnRoad SizedBox.expand() 可以在没有 Column 或 Row (flex) 作为父级的情况下使用。
      【解决方案3】:

      您可以将PositionedAlignStack 小部件一起使用

      堆栈允许您将元素堆叠在一起,数组中的最后一个元素具有最高的优先级。您可以使用AlignPositionedContainer 来定位堆栈的子级。

      对齐

      通过使用Alignment 设置对齐方式来移动小部件,Alignment 具有 topCenterbottomRight 等静态属性。或者您可以完全控制并设置Alignment(1.0, -1.0),它的 x,y 值范围为 1.0 到 -1.0,其中 (0,0) 为屏幕中心。

      Stack(
          children: [
              MyWidget(),
              Align(
                  alignment: Alignment.topCenter,
                  child: MyWidget(),
              ),
              Container(
                  alignment: Alignment(-0.9, -0.9),
                  child: MyWidget(),
              )  
          ]
      );
      

      定位

      作为对齐的替代方法,您可以相对于父小部件定位子小部件。

      ConstrainedBox(
        constraints: BoxConstraints.tight(Size(double.infinity, 256)),
        child: Stack(
          alignment: AlignmentDirectional.center,
          children: <Widget>[
            Positioned(
              top: 0.0,
              child: Icon(Icons.calendar_today,
                  size: 128.0, color: Colors.lightBlueAccent),
            ),
            Positioned(
                top: 4,
                right: 110,
                child: CircleAvatar(radius: 16, backgroundColor: Colors.red)),
          ],
        ),
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-06
        • 2020-02-03
        • 2020-10-23
        • 2020-10-08
        相关资源
        最近更新 更多