flutter 中的列表的性能优化续集#yyds干货盘点#

知是行的主意,行是知的功夫。这篇文章主要讲述flutter 中的列表的性能优化续集#yyds干货盘点#相关的知识,希望能为你提供帮助。
重新构建嵌套列表这一节使用 Slivers 而不是 ListViews 重建相同的 UI。
【flutter 中的列表的性能优化续集#yyds干货盘点#】前奏在这里
??https://blog.51cto.com/jianguo/4653002??
使用 Slivers 的列表列表下面的代码构建了与之前相同的 UI,但这次它使用??Slivers?? 而不是收缩包装??ListView??对象。本页的其余部分将引导您逐步完成更改。
如何将嵌套列表迁移到 Slivers

flutter 中的列表的性能优化续集#yyds干货盘点#

文章图片

第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:

    推荐阅读