Flutter ListTile 使用,设置 Padding、Align、Translate ,实现居中和间距

ListTile`是一个在 Flutter 中常用的列表项组件。它通常用于显示一行列表项,包含一个可选的前导图标、标题、副标题和尾随图标。

它是 Flutter 官方给我们实现的布局,很经典,今天这篇文章,我主要想分享如何对 ListTile 微调,通过微调自定义满足我们需求,而不用另外创建布局。

基本使用

我先展示一个基本的 ListTile ,将常见的属性都使用起来。前导图标(leading)和尾随图标(trailing)、标题(title)和一个副标题(subtitle)、添加了一个onTap回调。

  Widget buildClassicListTile(){
    return ListTile(
      leading: Icon(Icons.circle),
      title: Text('这是标题,图标未居中'),
      subtitle: Text('副标题,带点击事件,不紧凑'),
      trailing: Icon(Icons.arrow_forward),
      onTap: () {
        print('ListTile tapped');
      },
    );
  }

还有一个属性 dense ,它会给 ListTile 创建一个紧凑的布局,减少了垂直间距。同时,上面的文本也是可以设置样式的,所以我再创建两个 ListTile

  Widget buildDenseListTile(){
    return ListTile(
      dense: true,
      leading: Icon(Icons.circle),
      title: Text('这是标题,图标未居中'),
      subtitle: Text('副标题,带点击事件,紧凑'),
      trailing: Icon(Icons.arrow_forward),
      onTap: () {
        print('ListTile tapped');
      },
    );
  }
  
  Widget buildStyleListTile(){
    return ListTile(
      dense: true,
      leading: Icon(Icons.circle),
      title: Text(
        '这是标题,图标未居中',
        style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
      ),
      subtitle: Text(
        '副标题,紧凑,并且设置文本样式',
        style: TextStyle(fontSize: 14, fontStyle: FontStyle.italic),
      ),
      trailing: Icon(Icons.arrow_forward),
    );
  }

自定义用法

如何让 ListTile 图标垂直居中,这个需求应该挺常见的,很多设计图也会有这种设计,其实 ListTile 可以实现,这样我们就不用自定义 Widget 了。

  Widget buildCustomListTile(){
    return ListTile(
      leading: Align(
        widthFactor: 1.0,
        alignment: Alignment.center,
        child: Icon(Icons.circle)
      ),
      title: Text('这是标题,图标居中'),
      subtitle: Text('副标题'),
  		...
    );
  }

从上面图片可以看出来,图标和标题之间间有点大,我们也可以缩短减少这个间距。titleleading 之间默认间距是 40,我们可以使用 minLeadingWidth 设置。

  Widget buildCustomListTile(){
    return ListTile(
      minLeadingWidth : 10,
   		...
  }

另一种方法,也可以使用 Transform.translate 组件来调整 titlesubtitle 的位置。

  Widget buildCustomTransListTile(){
    return ListTile(
      title: Transform.translate(
          offset: Offset(-16, 0), // 控制水平偏移量
          child: Text('这是标题,图标居中')
      ),
      subtitle: Transform.translate(
        offset: Offset(-16, 0), // 控制水平偏移量
        child:   Text('副标题'),
      ),
  }

OK,以上就是我用 ListTile 碰到的需求,如果能灵活使用它的属性和玩法,类似布局就不用自己再创建,直接使用 ListTile 好了。

本文由老郭种树原创,转载请注明:https://guozh.net/flutter-listtile-usage/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注