dart Flutter列表视图,在列表的开头和结尾添加分隔符

tzxcd3kk  于 2023-03-27  发布在  Flutter
关注(0)|答案(3)|浏览(158)

使用flutter,什么是最简单和最干净的方法来放置分隔符,不仅行之间,而且作为第一行和最后一行?
我可以通过伪造itemCount并添加到额外的行来做到这一点。

...
child: ListView.separated(
  // Offset itemCount to start with separator
  itemCount: sortedList.length + 2,
  itemBuilder: (context, index) {
    if (index == 0) {
      return SizedBox(height: 0.0);
    }
    if (index == sortedList.length + 1) {
      return SizedBox(height: 0.0);
    }
    return ListItem(...);
  },
  separatorBuilder: (context, index) {
    return SizedBox(height: 10.0);
  }))),
uxh89sit

uxh89sit1#

恐怕这是我们用ListView.separated所能得到的最干净的了

ListView.separated(
  separatorBuilder: (context, index) => const Divider(height: 1.0,),
  itemCount: 2 + boardList.length,
  itemBuilder: (context, index) {
    if (index == 0 || index == boardList.length + 1) return const SizedBox.shrink();
    return MenuItem(
      board: boardList[index - 1], 
      isSelected: boardList[index].id == selectedBoardId
    );
  },
);

另一种方法是使用ListView.builder并将项目 Package 为带有边框底部的container

ListView.builder(
  itemCount: boardList.length,
  itemBuilder: (context, index) {
    return Container(
      decoration: BoxDecoration(
        color: (widget.isSelected) ? Colors.grey[50] : color,
        border: Border(
          top: (index == 0) ? BorderSide(color: Theme.of(context).dividerColor) : BorderSide.none
          bottom: BorderSide(color: Theme.of(context).dividerColor)
          
        )
      )
    ),
  },
);
ozxc1zmp

ozxc1zmp2#

你可以把你的ListView.serarated Package 在另一个ListView中,然后把你的分隔符放在ListView.separated的前面和后面。但是你需要定义scrollDirectionshrinkWrap,如示例所示。否则,你会得到一个错误,为unbounded hight。作为分隔符,我使用了Divider-Widget,但你可以使用任何你想要的。

ListView(
        children: <Widget>[
          Divider(),
          ListView.separated(
            scrollDirection: Axis.vertical,
            shrinkWrap: true,
            itemBuilder: // ...
            separatorBuilder: // ...
            itemCount: // ...
          ),
          Divider(),
        ],
      ),
wh6knrhe

wh6knrhe3#

或者让itemBuilder返回一个Column,列表项位于两个条件分隔符之间。

ListView.separated(
  separatorBuilder: (context, index) => const Divider(),
  itemCount: list.length,
  itemBuilder: ((context, index) {
    return Column(
      children: [
        if (index == 0)
          const Divider(),
        ListItem(
          index: index,
        ),
        if (list.length == index + 1)
          const Divider()
      ],
    );
  }),
)

相关问题