ListView
一般都會搭配 ListTile
,但 ListTile
自帶 Padding,且無法清除,最有效的方式是使用沒有自帶 Padding 的 GestureDetector
取代 ListTile
。
Version
Flutter 3.24
Flutter
- Android 與 iOS 都成功使用
GestureDetector
實現ListView
GestureDetector
import 'package:flutter/material.dart';
class Home extends StatelessWidget {
const Home({super.key});
void showSnackBar(
BuildContext context,
String message,
) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message),
),
);
}
Widget build(BuildContext context) {
var appBar = AppBar(
title: const Text('ListView GestureDetector'),
);
var listView = ListView(
padding: EdgeInsets.zero,
children: [
GestureDetector(
onTap: () => showSnackBar(context, 'Item 1'),
child: Container(
color: Colors.white,
padding: EdgeInsets.zero,
child: const Text(
'Item 1',
textAlign: TextAlign.left,
),
),
),
GestureDetector(
onTap: () => showSnackBar(context, 'Item 2'),
child: Container(
color: Colors.white,
padding: EdgeInsets.zero,
child: const Text(
'Item 2',
textAlign: TextAlign.left,
),
),
),
GestureDetector(
onTap: () => showSnackBar(context, 'Item 3'),
child: Container(
color: Colors.white,
padding: EdgeInsets.zero,
child: const Text(
'Item 3',
textAlign: TextAlign.left,
),
),
),
],
);
return Scaffold(
appBar: appBar,
body: listView,
);
}
}
Line 23
var listView = ListView(
padding: EdgeInsets.zero,
children: [
GestureDetector(
onTap: () => showSnackBar(context, 'Item 1'),
child: Container(
color: Colors.transparent,
padding: EdgeInsets.zero,
child: const Text(
'Item 1',
textAlign: TextAlign.left,
),
),
),
],
)
ListView
:外層一樣使用ListView
padding
:可在ListView
直接設定 paddingGestureDetector
:使用GestureDetector
取代ListTile
Container
:GestureDetector
並沒有提供 padding,須由Container
設定color
:設定項目的背景色padding
:設定項目的 paddingText
:設定項目顯示文字
Conclusion
- 使用
GestureDetector
的優點是 padding 可完全自主,不再受ListTile
預設padding
所限制,可更精確地呈現prototype
的 layout