Flutter - 如何对齐(小部件)孙小部件与孩子相同

Posted

技术标签:

【中文标题】Flutter - 如何对齐(小部件)孙小部件与孩子相同【英文标题】:Flutter - How to Align (widget) grandchildren widgets the same as the child 【发布时间】:2020-06-21 21:31:32 【问题描述】:

我已经在 google 和 s.o 上寻找答案,但找不到我喜欢的答案。

我使用 Stack 小部件作为我的页面布局。在该堆栈内,我将所有子小部件与对齐小部件定位。我试图在我的 Align 子项下创建一个 ListView 小部件,但它的卡片(子项)忽略了我设置为 List 的对齐值的 ListView 对齐方式。

    Align(
      alignment: Alignment(0, -0.28),
      child: Divider(
        color: Color.fromARGB(50, 255, 255, 255),
      ),
    ),
    Align(
      alignment: Alignment(0, -0.20),
      child: ListView(
        children: <Widget>[
          Card(
            child: ListTile(
            leading: Icon(some_icon),
            title: Text("blabla"),
          )),
        ],
      ),
    ),

我希望 ListView 项目在我的 Divider 下开始,因为为垂直对齐设置的值是 -0.20,它低于 Divider 对齐 (-0.28)。 但是,它的外观是这样的:

如果我删除 ListView 并将 Card 小部件设置为 Align 直接子部件,则定位很好。 现在,正如我在文档中所读到的,Align 小部件的对齐值是唯一的孩子,那么我将如何为 ListView 孩子(Rows/ListTiles/Card 等)实现相同的效果?

【问题讨论】:

【参考方案1】:

这只是一个示例!根据您的要求进行修改。 (已编辑

  @override
  Widget build(BuildContext context) 
    return Scaffold(
        body: Stack(children: [
      //Your behind widgets here...
      Stack(children: [
        Card(
            color: Colors.white,
            child:
                ListTile(title: Text('1st card', textAlign: TextAlign.center))),
        Align(
          alignment:Alignment(0, -0.20),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Container(
                height: 2,
                width: double.infinity,
                color: Colors.black,
                margin: EdgeInsets.only(right: 25, left: 25),
              ),
              SizedBox(
                height: 10,
                width: double.infinity,
              ),
              Card(
                  color: Colors.white,
                  child: ListView(shrinkWrap: true, children: [
                    ListTile(
                        title: Text('List card', textAlign: TextAlign.center))
                  ])),
            ],
          ),
        )
      ])
    ]));
  

【讨论】:

谢谢,但这不是我想要实现的。您已强制使用高度 X 的“SizedBox”将第二张卡片“推”下。但是,我对如何让我的 ListView chlidren 从 Align 小部件值位置开始感兴趣,而不是使用另一个小部件“向下推”它们.. 再次感谢,但这包括 Card->ListView 而不是其他方式,这是我想要弄清楚的。基本上我想要一个 ListView 从对齐位置 (x,y) 开始,并在其中包含一个 Row/Card,它将相对于 ListView 开始位置而不是在屏幕顶部开始,所有上述内容都在 Stack小部件。 您上面的草图/布局还不够!提供你想要的更好的图片!【参考方案2】:

请试试这个...

      body: Container(
        child: Center(
          child: Padding(
            padding: EdgeInsets.all(10),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                Divider(
                  thickness: 20, // this is for example
                  height: 22, // this is for example
                  color: Colors.red, // this is for example
                ),
                Card (
                    child: ListTile(
                  leading: Icon(Icons.print),
                  title: Text("blabla"),
                )),
              ],
            ),
          ),
        ),
      ),

【讨论】:

嘿 chirag,tnx,但我没有看到任何对包含卡片/行的 ListView 的引用。您可以查看我对您上面答案的评论以获得更清晰的解释。

以上是关于Flutter - 如何对齐(小部件)孙小部件与孩子相同的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中对齐小部件内的按钮

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

无法在 Flutter 中正确对齐小部件

Flutter Wrap 小部件对齐:在 ExpansionPanel 内部

Flutter 使用换行对齐两个文本小部件

Flutter - 如何在一行中显示文本和图标?