Row 小部件内的 Flutter Container 定位或对齐

Flutter Container Positioning or alignment inside Row widget

我是 flutter 的新手。现在正在学习如何定位或对齐小部件。我的行小部件内有两个容器。我想在左上角设置我的第一个容器(红色容器),还想在右上角设置我的第二个容器(蓝色容器)。我怎样才能做到这一点?

这里是代码示例:

class MyRow extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.teal,
        body: SafeArea(
          child: Row(
            children: <Widget>[
              Container(
                width: 100.0,
                height: 100.0,
                color: Colors.red,
              ),
              Container(
                width: 100.0,
                height: 100.0,
                color: Colors.blue,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Positioned 小部件仅与 Stack 小部件一起使用,因此您可以使用以下示例解决您的问题,但使用 Row 小部件可能无法解决问题

Stack(children: <Widget>[
            Positioned(
              top: 5,
              left: 5,
              child: Container(
                width: 100.0,
                height: 100.0,
                color: Colors.red,
              ),),
            Positioned(
              top: 5,
              right: 5,
              child: Container(
                width: 100.0,
                height: 100.0,
                color: Colors.blue,
              ),),
          ],
)

输出:

Flutter 在 Layouts, Mr.Tomek Polański has also explain 布局方面有丰富的详细文档。

您必须了解行和列方式 MainAxisAlignmentCrossAxisAlignment

当你想定位单个 child 的东西时,使用 FittedBoxConstrainedBoxSizedBox

因为您有多个 children's 在 ROW 小部件的引擎盖下 CrossAxisAlignment 是您的朋友用它来实现您的目标。

  1. 将您的 Container 包裹在 Expanded Widget 下,这将为您提供 Flex 属性,它可以帮助您为 Container 提供灵活性。扩展的小部件也将有助于您的横向和纵向屏幕尺寸。
  2. 在您的容器小部件中使用 SizedBox 小部件,这将为您提供最大宽度的不可见间隔 Sized Box 之间。
  3. 我把第一个 Container(Red One) 设置为 flex 属性 1 以及 Second Container(Blue One),这意味着将行的大小设置为 1 倍到两个容器,并将我的不可见 SizedBox 的大小加倍,以便我们的红框和蓝框可以放在左上角和右上角。

在这里您可以看到代码的最终版本。

return Scaffold(
  backgroundColor: Colors.teal,
  body: SafeArea(
    child: Row(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        Expanded(
          flex: 1,
          child: Container(
            width: 100.0,
            height: 100.0,
            color: Colors.red,
          ),
        ),
        Expanded(
          flex: 2,
          child: Container(
            width: double.infinity,
          ),
        ),
        Expanded(
          flex: 1,
          child: Container(
            width: 100.0,
            height: 100.0,
            color: Colors.blue,
          ),
        ),
      ],
    ),
  ),
);