欢迎关注微信公众号: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等文章, 可能有你想要了解的技能知识点哦~