Flutter 如何在ListView中重叠项目?

Flutter 如何在ListView中重叠项目?,flutter,flutter-layout,Flutter,Flutter Layout,我想在每个项目上都有一个阴影,每个项目都应该与下一个兄弟项目的顶部重叠 您可以使用立面和填充顶部来达到您想要的效果: ListView.builder( itemCount: 5, itemBuilder: (BuildContext content, int index) { return Padding(

我想在每个项目上都有一个阴影,每个项目都应该与下一个兄弟项目的顶部重叠


您可以使用
立面
填充
顶部来达到您想要的效果:

             ListView.builder(
                      itemCount: 5,
                      itemBuilder: (BuildContext content, int index) {
                        return Padding(
                          padding: const EdgeInsets.only(top: 8.0),
                          child: Material(
                            elevation: 5.0,
                            child: new Container(
                              height: 100.0,
                            ),
                          ),
                        );
                      })

如果要重叠项目,只需使用低于1.0的高度因子

           return Align(
                    alignment: Alignment.topLeft,
                    heightFactor: 0.9,
                    child: your item...

您可以使用
立面
填充
顶部来实现您想要的效果:

             ListView.builder(
                      itemCount: 5,
                      itemBuilder: (BuildContext content, int index) {
                        return Padding(
                          padding: const EdgeInsets.only(top: 8.0),
                          child: Material(
                            elevation: 5.0,
                            child: new Container(
                              height: 100.0,
                            ),
                          ),
                        );
                      })

如果要重叠项目,只需使用低于1.0的高度因子

           return Align(
                    alignment: Alignment.topLeft,
                    heightFactor: 0.9,
                    child: your item...

对于原始海报来说可能已经太晚了,但也许它会帮助其他人寻找:

我找到的解决这个问题的最佳方案(无需求助于手动管理的堆栈)是使用高度因子小于1的。这将导致下一项与上一项重叠

以下是实现这一目标的关键要素:

final elements = ['A', 'B', 'C'];
final padExtend = 16.0;

final media = MediaQuery.of(context);

return ListView.builder(
  itemCount: elements.length,
  itemBuilder: (BuildContext context, int index) {
    final String content = elements[index];
  
    return Align(
      child: Container(
        width: media.size.width - padExtend / 2.0,
        padding: EdgeInsets.all(padExtend),
        decoration: BoxDecoration(
          boxShadow: [
            BoxShadow(color: Colors.grey, spreadRadius: 3, blurRadius: 3, offset: Offset(2, 1)),
          ],
          color: Colors.white,
        ),
        child: Text(content),
      ),
      alignment: Alignment.topCenter,
      heightFactor: 0.9,
    );
  },
);

由于对齐将使元素居中,因此使用媒体查询来设置固定宽度。

对于原始海报来说可能已经太晚了,但它可能会帮助其他人查找:

我找到的解决这个问题的最佳方案(无需求助于手动管理的堆栈)是使用高度因子小于1的。这将导致下一项与上一项重叠

以下是实现这一目标的关键要素:

final elements = ['A', 'B', 'C'];
final padExtend = 16.0;

final media = MediaQuery.of(context);

return ListView.builder(
  itemCount: elements.length,
  itemBuilder: (BuildContext context, int index) {
    final String content = elements[index];
  
    return Align(
      child: Container(
        width: media.size.width - padExtend / 2.0,
        padding: EdgeInsets.all(padExtend),
        decoration: BoxDecoration(
          boxShadow: [
            BoxShadow(color: Colors.grey, spreadRadius: 3, blurRadius: 3, offset: Offset(2, 1)),
          ],
          color: Colors.white,
        ),
        child: Text(content),
      ),
      alignment: Alignment.topCenter,
      heightFactor: 0.9,
    );
  },
);

由于对齐将使元素居中,因此使用媒体查询来设置固定宽度。

使用
溢出框
包装元素并给出
最大高度
值将实现此效果

 return SizedBox(
            height: 35, //--> list children will be 35 in height
            child: OverflowBox(
              maxHeight: 50, // --> allowing the child to overflow will cause overlap between elements
              child: Container(
                height: 50,
                child: Text((index + 1).toString()),
              ),
            ),
          );
    

使用
OverflowBox
包装元素并给出
maxHeight
值将实现此效果

 return SizedBox(
            height: 35, //--> list children will be 35 in height
            child: OverflowBox(
              maxHeight: 50, // --> allowing the child to overflow will cause overlap between elements
              child: Container(
                height: 50,
                child: Text((index + 1).toString()),
              ),
            ),
          );
    

这只是在项目之间添加一个阴影。请阅读问题。这只是在项目之间添加一个阴影。请读问题。