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

Posted 坚果前端

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter 中的列表的性能优化续集#yyds干货盘点#相关的知识,希望对你有一定的参考价值。

重新构建嵌套列表

这一节使用 Slivers 而不是 ListViews 重建相同的 UI。

前奏在这里

​https://blog.51cto.com/jianguo/4653002​

使用 Slivers 的列表列表

下面的代码构建了与之前相同的 UI,但这次它使用​​Slivers​​ 而不是收缩包装​​ListView​​对象。本页的其余部分将引导您逐步完成更改。

如何将嵌套列表迁移到 Slivers

flutter

第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: SQL语句查询优化续集

关于flutter列表的性能优化,你必须要了解的

Flutter性能优化在携程酒店的实践

Flutter -Listview 4个优化能让你的列表丝般顺滑

#yyds干货盘点# MySQL性能优化:深入理解索引的这点事

Flutter 专题17 图解 ListView下拉刷新与上拉加载 #yyds干货盘点#