
在上一篇中,我们已经学会了:
但你一定已经意识到一个问题:
❓ 真实 App 里的列表,根本不是一行 Text
这一篇,我们就来解决这个问题。
你在手机上看到的列表通常是:
📌 这意味着:
ListView 的核心不是 ListView,而是“列表项 Widget”
先记住一句非常重要的话:
ListView = 滚动容器 每一项 = 普通 Widget
所以,只要你会写 Widget, 你就能写任何复杂列表项。
我们先从一个“信息卡片”开始。
[ 图片 ] 标题 副标题 时间
---
### 1️⃣ 数据准备
```dart
List<Map<String, String>> dataList = [
{
'title': 'Flutter 入门',
'subTitle': '零基础学 Flutter',
'time': '2024-01-01'
},
{
'title': 'Dart 语言',
'subTitle': 'Flutter 的基础',
'time': '2024-01-02'
},
];
ListView(
children: dataList.map((item) {
return buildItem(item);
}).toList(),
)
📌 关键点来了: 👉 每一项单独抽成一个 Widget 方法
Widget buildItem(Map<String, String> item) {
return Container(
padding: EdgeInsets.all(12),
margin: EdgeInsets.symmetric(vertical: 8, horizontal: 12),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
boxShadow: [
BoxShadow(
color: Colors.black12,
blurRadius: 4,
)
],
),
child: Row(
children: [
// 左侧占位图片
Container(
width: 60,
height: 60,
color: Colors.grey[300],
),
SizedBox(width: 12),
// 右侧文字区域
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item['title']!,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
SizedBox(height: 4),
Text(item['subTitle']!),
SizedBox(height: 4),
Text(
item['time']!,
style: TextStyle(color: Colors.grey, fontSize: 12),
),
],
),
),
],
),
);
}
这是一个非常重要的工程习惯:
✅ 代码更清晰 ✅ 方便复用 ✅ 易维护 ✅ 真实项目写法
📌 记住:
ListView 只负责“列表” Item Widget 负责“长相”
真实 App 的列表一定是可以点的。
GestureDetector(
onTap: () {
print('点击了 ${item['title']}');
},
child: buildItem(item),
);
ListView(
children: dataList.map((item) {
return GestureDetector(
onTap: () {
print('点击了 ${item['title']}');
},
child: buildItem(item),
);
}).toList(),
)
当数据很多时(比如上百条):
👉 推荐使用 ListView.builder
ListView.builder(
itemCount: dataList.length,
itemBuilder: (context, index) {
return buildItem(dataList[index]);
},
);
📌 优点:
❌ 列表项写在 build 里一大坨 ❌ ListView 嵌套 Column 不加 Expanded ❌ 不封装 item ❌ 写死高度导致溢出 ❌ 数据和 UI 混在一起
你已经学会:
📌 到这里为止:
你已经具备开发“信息流页面”的能力
ListView 不难, 难的是“把列表项当成普通 Widget 来设计”
《Flutter 零基础入门(三十):GridView 网格布局 —— 商品页与九宫格必学》
下一篇我们将学习:
🚀 Flutter UI 能力,将在下一篇彻底补齐