flutter 中的列表的性能优化续集#yyds干货盘点#
Posted 坚果前端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter 中的列表的性能优化续集#yyds干货盘点#相关的知识,希望对你有一定的参考价值。
重新构建嵌套列表
这一节使用 Slivers 而不是 ListViews 重建相同的 UI。
前奏在这里
https://blog.51cto.com/jianguo/4653002
使用 Slivers 的列表列表下面的代码构建了与之前相同的 UI,但这次它使用Slivers
而不是收缩包装ListView
对象。本页的其余部分将引导您逐步完成更改。
如何将嵌套列表迁移到 Slivers
第1步
首先,将最外面的 ListView 更改为SliverList
.
// Before
Widget build(BuildContext context) {
return ListView.builder(
itemCount: numberOfLists,
itemBuilder: (context, index) => innerLists[index],
);
}
变成:
// After
Widget build(BuildContext context) {
return CustomScrollView(slivers: innerLists);
}
第2步
其次,将内部列表的类型从List
更改为 List
。
// Before
List innerLists = [];
变成:
// After
List innerLists = [];
第 3 步
现在是时候重建内部列表了。的SliverList
类是比原始略有不同ListView
的类,与主要差异是的外观delegate
。原始版本
ListView
对所有内容都使用对象,不知道内部构建器构造函数将被shrinkWrap
.
// Before
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
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 {
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);
_ShrinkWrapSliversState createState() => _ShrinkWrapSliversState();
}
class _ShrinkWrapSliversState extends State {
List innerLists = [];
final numLists = 15;
final numberOfItemsPerList = 100;
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,
),
),
);
}
}
Widget build(BuildContext context) {
return CustomScrollView(slivers: innerLists);
}
}
class ColorRow extends StatefulWidget {
const ColorRow({Key? key}) : super(key: key);
State createState() => ColorRowState();
}
class ColorRowState extends State {
Color? color;
void initState() {
super.initState();
color = randomColor();
}
Widget build(BuildContext context) {
print(Building ColorRowState);
return Container(
decoration: BoxDecoration(
gradient: SQL语句查询优化续集Flutter -Listview 4个优化能让你的列表丝般顺滑