歡迎關注微信公衆號:FSA全棧行動 👋前端
經過 ListView()
默認構造器建立出來的列表, 會一次性加載所有的 item, 是比較消耗性能的, 在列表 item 個數明確只有較少的情景下可使用, 常見參數有:微信
Axis.horizontal
改成橫向List.generate()
批量建立class ListViewDemo1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(
// scrollDirection: Axis.horizontal, // 滾動方向
// itemExtent: 100, // item在scrollDirection方向上的尺寸
reverse: true,
children: List.generate(100, (index) {
// return Text("Hello lqr : $index", style: TextStyle(fontSize: 30));
return ListTile(
leading: Icon(Icons.people),
trailing: Icon(Icons.delete),
title: Text("聯繫人$index"),
subtitle: Text("聯繫人電話號碼:18812345678"),
);
}),
);
}
}
複製代碼
使用 ListView 的命名構造函數 builder()
建立出來的列表, 只有當 item 須要展現時纔會建立加載(調用 itemBuilder
函數), 適用於有大量數據的列表場景, 常見參數以下:markdown
(BuildContext context, int index){}
itemBuilder 的函數類型定義是:
typedef IndexedWidgetBuilder = Widget Function(BuildContext context, int index);
less
class ListViewDemo2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: 100,
itemExtent: 60,
itemBuilder: (BuildContext context, int index) {
return Text("Hello lqr: $index", style: TextStyle(fontSize: 20));
},
);
}
}
複製代碼
使用 ListView 的命名構造函數 separated()
建立列表與 builder()
同樣, 都是按需建立加載 item, 區別在於 separated()
能夠繪製分割線, 常見屬性以下:dom
(BuildContext context, int index){}
separatorBuilder 的函數類型定義是:
typedef IndexedWidgetBuilder = Widget Function(BuildContext context, int index);
ide
通常使用 Divider
這個 widget 來建立分割線, 其構造函數參數有:函數
class ListViewDemo3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView.separated(
itemCount: 100,
itemBuilder: (BuildContext context, int index) {
return Text("Hello lqr: $index", style: TextStyle(fontSize: 20));
},
separatorBuilder: (BuildContext context, int index) {
return Divider(
color: Colors.red,
height: 40, // widget的高度
thickness: 10, // 分割線的厚度
indent: 10, // 分割線前端的空隙
endIndent: 30, // 分割線末端的空隙
);
},
);
}
}
複製代碼
GridView()
+ SliverGridDelegateWithFixedCrossAxisCount
的簡寫GridView()
+ SliverGridDelegateWithMaxCrossAxisExtent
的簡寫使用 GridView 默認構造函數建立的網格會一次性加載全部 item, 適用於 item 個數較少的場景, 能夠把 GridView 理解爲是能夠有多列的 ListView, 當有行有列時, 就會有定製行列樣式的需求, 由參數 gridDelegate
來配置, gridDelegate 的類型是 SliverGridDelegate
, 該抽象類有 2 個實現類:oop
gridDelegate
: 網格代理, 用於控制子 widget 在 GridView 中的擺放性能
SliverGridDelegateWithFixedCrossAxisCount
常見參數有:ui
class GridViewDemo1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
/// SliverGridDelegateWithFixedCrossAxisCount: 交叉軸固定item個數(幾列咱們本身定)
/// 簡寫: GridView.count(crossAxisCount: 3)
return GridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
childAspectRatio: .8, // ratio = 寬度 / 高度
crossAxisSpacing: 8,
mainAxisSpacing: 8,
),
children: List.generate(100, (index) {
return Container(
color: Color.fromARGB(
255,
Random().nextInt(256),
Random().nextInt(256),
Random().nextInt(256),
),
);
}),
);
}
}
複製代碼
SliverGridDelegateWithMaxCrossAxisExtent
常見參數有:
class GridViewDemo2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GridView(
/// SliverGridDelegateWithMaxCrossAxisExtent: 交叉軸上item最大範圍(幾列交給flutter算)
/// 簡寫: GridView.extent(maxCrossAxisExtent: 400)
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 400,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
childAspectRatio: 1.8,
),
itemCount: 100,
children: List.generate(100, (index) {
return Container(
color: Color.fromARGB(
255,
Random().nextInt(256),
Random().nextInt(256),
Random().nextInt(256),
),
);
}),
);
}
}
複製代碼
使用 GridView 命名構造函數 builder()
建立的網格會按需建立加載 item, 適用於有大量的數據展現場景, 常見參數有:
(BuildContext context, int index){}
itemBuilder 的函數類型定義是: typedef IndexedWidgetBuilder = Widget Function(BuildContext context, int index);
class GridViewDemo3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
itemCount: 100,
itemBuilder: (BuildContext context, int index) {
return Container(
color: Color.fromARGB(255, Random().nextInt(256),
Random().nextInt(256), Random().nextInt(256)),
);
},
);
}
}
複製代碼
若是文章對您有所幫助, 請不吝點擊關注一下個人微信公衆號:FSA全棧行動, 這將是對我最大的激勵. 公衆號不只有Android技術, 還有iOS, Python等文章, 可能有你想要了解的技能知識點哦~