如何在颤振中实现以下布局?

Posted

技术标签:

【中文标题】如何在颤振中实现以下布局?【英文标题】:How can I achieve the following layout in flutter? 【发布时间】:2021-09-21 22:42:22 【问题描述】:

我想要达到的东西是这样的:

这些是我想要达到的主要限制:

    “text”-s 在下方“button”-s 上方居中,并且当屏幕足够短时,“thing2”能够进入“texts”-s 之间。

    我希望“按钮”-s 始终保持相同的高度/宽度(这可以通过 SizedBox 之类的工具轻松完成)并且与顶部/底部的距离相同。

    我希望“thing1”最大为 x 高度,并在需要时向下缩放屏幕(通过缩小文本或使其可滚动,我还没有决定,这不是主要问题)。

    我希望“thing2”始终随屏幕缩放。

    当屏幕足够大时,我希望“thing1”和“thing2”平均分配它们之间的空间,并且每个都在自己空间的中心。

现在我的布局如下:

列:MainAxisAlignment.SpaceBetween,高度固定 容器:高度固定 行:MainAxisAlignment.SpaceBetween 按钮 按钮 容器:高度固定 东西1 Container:根据屏幕高度和其他Container的高度计算的高度 东西2 容器:高度固定 行:MainAxisAlignment.SpaceBetween 按钮 按钮

这当然不是全部,我试图包含所有关于我的布局的相关信息,而不是毫无意义地提供太多信息。

如何在“按钮”-s 上方添加“文本”-s? (我尝试过 Stack,但后来我不知道如何让它们出现在“按钮”上方,同时让“thing2”也出现在它们上方。

【问题讨论】:

【参考方案1】:

我用这段代码实现了这些事情(其中 MyBox 是一个简单的小部件,带有一个带有宽度和高度的彩色容器):

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    const double buttonHeight = 35;
    const double buttonWidth = 100;
    const double textHeight = 40;
    const double textWidth = 30;
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Stack(
        children: [
          Align(
            alignment: Alignment.topLeft,
            child: SizedBox(
              width: buttonWidth,
              height: buttonHeight,
              child: MyBox(Colors.red),
            ),
          ),
          Align(
            alignment: Alignment.topRight,
            child: SizedBox(
              width: buttonWidth,
              height: buttonHeight,
              child: MyBox(Colors.yellow),
            ),
          ),
          Align(
            alignment: Alignment.bottomLeft,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.end,
              children: [
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: SizedBox(
                    width: textWidth,
                    height: textHeight,
                    child: MyBox(Colors.green),
                  ),
                ),
                SizedBox(
                  width: buttonWidth,
                  height: buttonHeight,
                  child: MyBox(Colors.cyan),
                ),
              ],
            ),
          ),
          Align(
            alignment: Alignment.bottomRight,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.end,
              children: [
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: SizedBox(
                    width: textWidth,
                    height: textHeight,
                    child: MyBox(Colors.indigo),
                  ),
                ),
                SizedBox(
                  width: buttonWidth,
                  height: buttonHeight,
                  child: MyBox(Colors.blue),
                ),
              ],
            ),
          ),
          Align(
            alignment: Alignment.bottomCenter,
            child: SizedBox(
              width: buttonWidth,
              height: buttonHeight,
              child: MyBox(Colors.orange),
            ),
          ),
          Positioned(
            left: 0,
            top: 0,
            right: 0,
            bottom: buttonHeight,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                Flexible(
                  fit: FlexFit.loose,
                  child: MyBox(Colors.purple),
                ),
                Flexible(
                  fit: FlexFit.loose,
                  child: MyBox(Colors.brown),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  

TLDR:我使用 Stack 小部件来保存我的其他小部件,并使用 Align 小部件来对齐(duh)我在 Stack 中的小部件。 我使用 Column 将我的文本置于下方按钮上方。 “mainAxisAlignment: MainAxisAlignment.end”很重要,因此该列位于底部而不是顶部。 最后,我将 Stack 包裹在 Padding 中。

【讨论】:

以上是关于如何在颤振中实现以下布局?的主要内容,如果未能解决你的问题,请参考以下文章

在颤振中使用最佳方法创建自定义复杂布局?

如何在颤振中创建以下小部件

颤振:布局期间对象被赋予无限大小

如何在颤振中实现推送通知

颤振 - 布局

如何在颤振中实现未来的下拉列表并根据用户选择更新值