# Flutter GridView介紹 可滾動的小物件,提供水平及垂直滾動,ListView 基本上是以線性排列元件,如果想以網格的方式排列元件,並具有捲動效果則可以使用GridView, * SliverGridDelegateWithFixedCrossAxisCount 提供了 cross axis 方向上固定元素的排列,藉由`crossAxisCount`進行設定,另外透過設定`childAspectRatio `也可以設定元件的緊密度,數值越大越緊密。 ```dart void main() { runApp( MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Openhome.cc')), body: GridView( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, childAspectRatio: 1 ), children: demoChildren(32) ) ) ) ); } ``` ![](https://i.imgur.com/JTIEcrx.png) * SliverGridDelegateWithMaxCrossAxisExtent ## 添加滾動監聽事件 假設需求為置底及置頂需進行print * 將狀態改為 StatefulWidget * init ```dart late ScrollController _controller; @override void initState() { super.initState(); _controller = ScrollController(); _controller.addListener(_scrollListener); } ``` * dispose ```dart @override void dispose() { _controller.removeListener(_scrollListener); super.dispose(); } ``` * ListView添加監聽 ```dart ListView( controller: _controller, scrollDirection: Axis.vertical, children: [] ) ``` ## GridView.builder() ### 簡介 通常用於異步獲取數據源時,GridView.builder必須指定的參數有兩個: ```dart GridView.builder( ... required SliverGridDelegate gridDelegate, required IndexedWidgetBuilder itemBuilder, ) ``` ### 程式範例 ```dart class InfiniteGridView extends StatefulWidget { @override _InfiniteGridViewState createState() => _InfiniteGridViewState(); } class _InfiniteGridViewState extends State<InfiniteGridView> { List<IconData> _icons = []; //保存Icon數據 @override void initState() { super.initState(); // 初始化 _retrieveIcons(); } @override Widget build(BuildContext context) { return GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, //每行三列 childAspectRatio: 1.0, //長寬比 ), itemCount: _icons.length, itemBuilder: (context, index) { //如果顯示到最後一個並且Icon總數小於200時繼續再入數據 if (index == _icons.length - 1 && _icons.length < 200) { _retrieveIcons(); } return Icon(_icons[index]); }, ); } //模擬異步獲取數據 void _retrieveIcons() { Future.delayed(Duration(milliseconds: 200)).then((e) { setState(() { _icons.addAll([ Icons.ac_unit, Icons.airport_shuttle, Icons.all_inclusive, Icons.beach_access, Icons.cake, Icons.free_breakfast, ]); }); }); } } ``` ## GridView.count() ## GridView.custom() ## GridView.extent() ## 參考資料 1. https://openhome.cc/Gossip/Flutter/GridView.html ###### tags: `flutter`