在颤动中与堆栈对齐

Posted

技术标签:

【中文标题】在颤动中与堆栈对齐【英文标题】:Alignment with Stack in flutter 【发布时间】:2020-03-17 03:50:43 【问题描述】:

项目

嗨, 我试图在 Flutter 的 Stack 中对齐一些小部件。我的最终结果是这样的:

我知道这可以通过 Row 轻松实现,但我想为两个孩子的位置设置动画,所以我不得不使用堆栈。

我的问题很简单:

示例代码

return Container(
  child: Stack(
    children: <Widget>[
      Align(
        alignment: Alignment.centerLeft,
        child: _buildSign(),
      ),
      Align(
        alignment: Alignment.centerRight,
        child: _buildSign(),
      ),
    ],
  ),
);

这不会像我预期的那样呈现。无论我在 alignment 字段中输入什么内容:Alignment.centerRightAlignment.centerLeft 都会始终将孩子放在左侧中间。

只有给包装容器一个固定的宽度才能解决问题。现在我明白为什么会发生这种情况了,但是如果我想让容器和他的孩子一样大怎么办?标签是动态文本,所以他的宽度对我来说是不可预测的

有什么想法吗?

谢谢

【问题讨论】:

"I know that this can be easily achieved with a Row but I want to animate the position ot the two children so I'm forced to use stack." 所以请改用Flow 小部件(点击演示影片查看其工作原理) 【参考方案1】:

Hy justAnotherOverflowUser,

在您的情况下,您必须在Stack Widget 中使用Positioned Widget, 它会给你你想要的。

例如:

Positioned(
  left: 20.0,
  child: Icon(
    Icons.monetization_on, 
    size: 36.0, 
    color: const Color.fromRGBO(218, 165, 32, 1.0)
  )
)

【讨论】:

我正在考虑这个问题。但是我的动画必须交换两个元素的位置。加号必须从左侧开始动画:20 到 20 结尾。据我所知,除非您知道小部件的宽度,否则这是不可能的 正确答案在这里***.com/questions/55054721/… 当您使用 rtl 和 ltr 时,AlignmentDirectional 会派上用场,因此使用 Positioned 并不是一个很好的解决方案【参考方案2】:

更灵活的对齐方式是将AlignPositioned.fill 包装起来 原来的答案贴在这里Flutter: bottom center widget in stack

return Container(
  child: Stack(
    children: <Widget>[
      Positioned.fill(
       child: Align(
        alignment: Alignment.centerLeft,
        child: _buildSign(),
      ),),
      Positioned.fill(
       child:Align(
        alignment: Alignment.centerRight,
        child: _buildSign(),
      ),),
    ],
  ),
);

【讨论】:

以上是关于在颤动中与堆栈对齐的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中推动替换删除整个导航堆栈?

如何在颤动中从导航器堆栈中弹出最后三个路由

可扩展的浮动操作按钮(使用堆栈)在颤动中不起作用

每次当前选项卡在 TabBar 颤动中更改时,如何将新页面添加到导航器堆栈?

什么是“堆栈对齐”?

左对齐的水平堆栈视图和顶部对齐的垂直堆栈视图