知是行的主意,行是知的功夫。这篇文章主要讲述flutter 中的列表的性能优化续集#yyds干货盘点#相关的知识,希望能为你提供帮助。
重新构建嵌套列表这一节使用 Slivers 而不是 ListViews 重建相同的 UI。
【flutter 中的列表的性能优化续集#yyds干货盘点#】前奏在这里
??https://blog.51cto.com/jianguo/4653002??
使用 Slivers 的列表列表下面的代码构建了与之前相同的 UI,但这次它使用??Slivers?
? 而不是收缩包装??ListView?
?对象。本页的其余部分将引导您逐步完成更改。
如何将嵌套列表迁移到 Slivers
文章图片
第1步
首先,将最外面的 ListView 更改为?
?SliverList?
?.// Before
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: numberOfLists,
itemBuilder: (context, index) => innerLists[index],
);
}
变成:
// After
@override
Widget build(BuildContext context) {
return CustomScrollView(slivers: innerLists);
}
第2步
其次,将内部列表的类型从?
?List?
?更改为 ??List?
?。// Before
List innerLists = [];
变成:
// After
List innerLists = [];
第 3 步
现在是时候重建内部列表了。的?
?SliverList?
?类是比原始略有不同??ListView?
?的类,与主要差异是的外观??delegate?
?。原始版本??ListView?
?对所有内容都使用对象,不知道内部构建器构造函数将被??shrinkWrap?
?.// Before
@override
void initState() {
super.initState();
for (int i = 0; i < numberOfLists; i++) {
final _innerList = [];
for (int j = 0; j < numberOfItemsPerList; j++) {
_innerList.add(const ColorRow());
}
innerLists.add(
ListView.builder(
itemCount: numberOfItemsPerList,
itemBuilder: (BuildContext context, int index) => _innerList[index],
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
),
);
}
}
更改后,?
?ListView?
?对象被替换为??SliverList?
?对象,每个对象都使用一个??SliverChildBuilderDelegate?
?来提供高效的按需构建。// After
@override
void initState() {
super.initState();
for (int i = 0; i < numLists; i++) {
final _innerList = [];
for (int j = 0; j < numberOfItemsPerList; j++) {
_innerList.add(const ColorRow());
}
innerLists.add(
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) => _innerList[index],
childCount: numberOfItemsPerList,
),
),
);
}
}
完整代码:
import package:flutter/material.dart;
import dart:math as math;
void main() {
runApp(SliversApp());
}
class SliversApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: ShrinkWrap vs Slivers,
home: Scaffold(
appBar: AppBar(
title: const Text("Revenge of the Slivers"),
),
body: const ShrinkWrapSlivers(),
),
);
}
}
class ShrinkWrapSlivers extends StatefulWidget {
const ShrinkWrapSlivers({
Key? key,
}) : super(key: key);
@override
_ShrinkWrapSliversState createState() => _ShrinkWrapSliversState();
}
class _ShrinkWrapSliversState extends State {
List innerLists = [];
final numLists = 15;
final numberOfItemsPerList = 100;
@override
void initState() {
super.initState();
for (int i = 0; i < numLists; i++) {
final _innerList = [];
for (int j = 0; j < numberOfItemsPerList; j++) {
_innerList.add(const ColorRow());
}
innerLists.add(
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) => _innerList[index],
childCount: numberOfItemsPerList,
),
),
);
}
}
@override
Widget build(BuildContext context) {
return CustomScrollView(slivers: innerLists);
}
}
@immutable
class ColorRow extends StatefulWidget {
const ColorRow({Key? key}) : super(key: key);
@override
State createState() => ColorRowState();
}
class ColorRowState extends State {
Color? color;
@override
void initState() {
super.initState();
color = randomColor();
}
@override
Widget build(BuildContext context) {
print(Building ColorRowState);
return Container(
decoration: BoxDecoration(
gradient:推荐阅读
- docker镜像文件分层
- 使用命令模式重构播放器控制条
- Linux快速学习-vi编辑器常用命令
- 硬核图解 Eureka 注册表 #yyds干货盘点#
- 装机高手教你U盘装系统步骤
- 装机高手教你U盘装系统win7
- 装机高手教你笔记本怎样用U盘打开
- 装机高手教你如何处理U盘插电脑没反应
- 装机高手教你U盘病毒专杀工具