最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android ListView列表優(yōu)化的方法詳解

 更新時(shí)間:2022年05月17日 12:32:06   作者:島上碼農(nóng)  
列表 ListView 是應(yīng)用中最為常見的組件,而列表往往也會(huì)承載很多元素,這時(shí)就需要對(duì)其進(jìn)行優(yōu)化。本文介紹了 Flutter ListView 的4個(gè)優(yōu)化要點(diǎn),非常實(shí)用,需要的可以參考一下

前言

列表 ListView 是應(yīng)用中最為常見的組件,而列表往往也會(huì)承載很多元素,當(dāng)元素多,尤其是那種圖片文件比較大的場(chǎng)合,就可能會(huì)導(dǎo)致列表卡頓,嚴(yán)重的時(shí)候可能導(dǎo)致應(yīng)用崩潰。本篇來介紹如何優(yōu)化列表。

優(yōu)化點(diǎn)1:使用 builder構(gòu)建列表

當(dāng)你的列表元素是動(dòng)態(tài)增長(zhǎng)的時(shí)候(比如上拉加載更多),請(qǐng)不要直接用children 的方式,一直往children 的數(shù)組增加組件,那樣會(huì)很糟糕。

//糟糕的用法
ListView(
??children:?[
????item1,
????item2,
????item3,
????...
??],
)

//正確的用法
ListView.builder(
??itemBuilder:?(context,?index)?=>?ListItem(),
??itemCount:?itemCount,
)

對(duì)于 ListView.builder 是按需構(gòu)建列表元素,也就是只有那些可見的元素才會(huì)調(diào)用itemBuilder 構(gòu)建元素,這樣對(duì)于大列表而言性能開銷自然會(huì)小很多。

Creates a scrollable, linear array of widgets that are created on demand. This constructor is appropriate for list views with a large (or infinite) number of children because the builder is called only for those children that are actually visible.

優(yōu)化點(diǎn)2:禁用 addAutomaticKeepAlives 和 addRepaintBoundaries 特性

這兩個(gè)屬性都是為了優(yōu)化滾動(dòng)過程中的用戶體驗(yàn)的。addAutomaticKeepAlives 特性默認(rèn)是 true,意思是在列表元素不可見后可以保持元素的狀態(tài),從而在再次出現(xiàn)在屏幕的時(shí)候能夠快速構(gòu)建。這其實(shí)是一個(gè)拿空間換時(shí)間的方法,會(huì)造成一定程度的內(nèi)存開銷。可以設(shè)置為 false 關(guān)閉這一特性。缺點(diǎn)是滑動(dòng)過快的時(shí)候可能會(huì)出現(xiàn)短暫的白屏(實(shí)際會(huì)很少發(fā)生)。

addRepaintBoundaries 是將列表元素使用一個(gè)重繪邊界(Repaint Boundary)包裹,從而使得滾動(dòng)的時(shí)候可以避免重繪。而如果列表很容易繪制(列表元素布局比較簡(jiǎn)單的情況下)的時(shí)候,可以關(guān)閉這個(gè)特性來提高滾動(dòng)的流暢度。

addAutomaticKeepAlives:?false,
addRepaintBoundaries:?false,

優(yōu)化點(diǎn)3:盡可能將列表元素中不變的組件使用 const 修飾

使用 const 相當(dāng)于將元素緩存起來實(shí)現(xiàn)共用,若列表元素某些部分一直保持不變,那么可以使用 const 修飾。

return?Padding(
??child:?Row(
????children:?[
??????const?ListImage(),
??????const?SizedBox(
????????width:?5.0,
??????),
??????Text('第$index?個(gè)元素'),
????],
??),
??padding:?EdgeInsets.all(10.0),
);

優(yōu)化點(diǎn)4:使用 itemExtent 確定列表元素滾動(dòng)方向的尺寸

對(duì)于很多列表,我們?cè)跐L動(dòng)方向上的尺寸是提前可以根據(jù) UI設(shè)計(jì)稿知道的,如果能夠知道的話,那么使用 itemExtent 屬性制定列表元素在滾動(dòng)方向的尺寸,可以提升性能。這是因?yàn)?,如果不指定的話,在滾動(dòng)過程中,會(huì)需要推算每個(gè)元素在滾動(dòng)方向的尺寸從而消耗計(jì)算資源。

itemExtent:?120,

優(yōu)化實(shí)例

下面是一開始未改造的列表,嗯,可以認(rèn)為是垃圾代碼。

class?LargeListView?extends?StatefulWidget?{
??const?LargeListView({Key??key})?:?super(key:?key);

??@override
??_LargeListViewState?createState()?=>?_LargeListViewState();
}

class?_LargeListViewState?extends?State<LargeListView>?{
??@override
??Widget?build(BuildContext?context)?{
????return?Scaffold(
??????appBar:?AppBar(
????????title:?Text('大列表'),
????????brightness:?Brightness.dark,
??????),
??????body:?ListView(
????????children:?List.generate(
??????????1000,
??????????(index)?=>?Padding(
????????????padding:?EdgeInsets.all(10.0),
????????????child:?Row(
??????????????children:?[
????????????????Image.network(
??????????????????'https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7869eac08a7d4177b600dc7d64998204~tplv-k3u1fbpfcp-watermark.jpeg',
??????????????????width:?200,
????????????????),
????????????????const?SizedBox(
??????????????????width:?5.0,
????????????????),
????????????????Text('第$index?個(gè)元素'),
??????????????],
????????????),
??????????),
????????),
??????),
????);
??}
}

當(dāng)然,實(shí)際不會(huì)是用 List.generate 來生成列表元素,但是也不要用一個(gè) List<Widget> 列表對(duì)象一直往里面加列表元素,然后把這個(gè)列表作為 ListView 的 children!改造后的代碼如下所示,因?yàn)閷⒘斜碓夭鸱值酶?xì),代碼量是多一些,但是性能上會(huì)好很多。

import?'package:flutter/material.dart';

class?LargeListView?extends?StatefulWidget?{
??const?LargeListView({Key??key})?:?super(key:?key);

??@override
??_LargeListViewState?createState()?=>?_LargeListViewState();
}

class?_LargeListViewState?extends?State<LargeListView>?{
??@override
??Widget?build(BuildContext?context)?{
????return?Scaffold(
??????appBar:?AppBar(
????????title:?Text('大列表'),
????????brightness:?Brightness.dark,
??????),
??????body:?ListView.builder(
????????itemBuilder:?(context,?index)?=>?ListItem(
??????????index:?index,
????????),
????????itemCount:?1000,
????????addAutomaticKeepAlives:?false,
????????addRepaintBoundaries:?false,
????????itemExtent:?120.0,
??????),
????);
??}
}

class?ListItem?extends?StatelessWidget?{
??final?int?index;
??ListItem({Key??key,?required?this.index})?:?super(key:?key);

??@override
??Widget?build(BuildContext?context)?{
????return?Padding(
??????child:?Row(
????????children:?[
??????????const?ListImage(),
??????????const?SizedBox(
????????????width:?5.0,
??????????),
??????????Text('第$index?個(gè)元素'),
????????],
??????),
??????padding:?EdgeInsets.all(10.0),
????);
??}
}

class?ListImage?extends?StatelessWidget?{
??const?ListImage({Key??key})?:?super(key:?key);

??@override
??Widget?build(BuildContext?context)?{
????return?Image.network(
??????'https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7869eac08a7d4177b600dc7d64998204~tplv-k3u1fbpfcp-watermark.jpeg',
??????width:?200,
????);
??}
}

總結(jié)

本篇介紹了 Flutter ListView 的4個(gè)優(yōu)化要點(diǎn),非常實(shí)用哦!實(shí)際上,這些要點(diǎn)都可以從官網(wǎng)的文檔里找出對(duì)應(yīng)的說明。因此,如果遇到了性能問題,除了搜索引擎外,也建議多看看官方的文檔。另外一個(gè),對(duì)于列表圖片,有時(shí)候也需要前后端配合,比如目前的手機(jī)都是號(hào)稱1億像素的,如果上傳的時(shí)候直接上傳原圖,那么加載如此大的圖片肯定是非常消耗資源的。對(duì)于這種情況,建議是生成列表縮略圖(可能需要針對(duì)不同屏幕尺寸生成不同的縮略圖)。

以上就是Android ListView列表優(yōu)化的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Android ListView列表優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android基于Pull方式解析xml的方法詳解

    Android基于Pull方式解析xml的方法詳解

    這篇文章主要介紹了Android基于Pull方式解析xml的方法,結(jié)合實(shí)例形式詳細(xì)分析了Pull方式解析xml的原理、操作步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • Android實(shí)現(xiàn)評(píng)論欄隨Recyclerview滑動(dòng)左右移動(dòng)

    Android實(shí)現(xiàn)評(píng)論欄隨Recyclerview滑動(dòng)左右移動(dòng)

    這篇文章主要介紹了Android實(shí)現(xiàn)評(píng)論欄隨Recyclerview滑動(dòng)左右移動(dòng)效果,仿約會(huì)吧應(yīng)用詳情頁(yè)實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android 關(guān)于ExpandableListView刷新問題的解決方法

    Android 關(guān)于ExpandableListView刷新問題的解決方法

    下面小編就為大家?guī)硪黄狝ndroid 關(guān)于ExpandableListView刷新問題的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • Android實(shí)現(xiàn)圖片緩存與異步加載

    Android實(shí)現(xiàn)圖片緩存與異步加載

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片緩存與異步加載的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 詳解Android中Runtime解決屏幕旋轉(zhuǎn)問題(推薦)

    詳解Android中Runtime解決屏幕旋轉(zhuǎn)問題(推薦)

    這篇文章主要介紹了Runtime解決屏幕旋轉(zhuǎn)問題的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • Android Studio設(shè)置主題與字體大小圖文教程

    Android Studio設(shè)置主題與字體大小圖文教程

    這篇文章通過圖文詳細(xì)的給大家介紹了Android Studio中如何設(shè)置主題與字體大小,文章介紹的非常詳細(xì),相信對(duì)大家學(xué)習(xí)使用Android Studio具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • Android開發(fā)實(shí)現(xiàn)的圖片點(diǎn)擊切換功能示例

    Android開發(fā)實(shí)現(xiàn)的圖片點(diǎn)擊切換功能示例

    這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的圖片點(diǎn)擊切換功能,涉及Android ImageView組件創(chuàng)建、布局及實(shí)現(xiàn)圖形切換相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • Android ListView控件使用方法

    Android ListView控件使用方法

    這篇文章主要為大家詳細(xì)介紹了Android ListView控件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Android控件系列之XML靜態(tài)資源使用介紹

    Android控件系列之XML靜態(tài)資源使用介紹

    本文全面介紹了在Android中,如何充分利用XML布局文件來配合Java構(gòu)筑界面,從而達(dá)到界面與邏輯的代碼分離。另外,還介紹了如何分別在XML和代碼中如何獲取靜態(tài)資源的值或者控件的實(shí)例
    2012-11-11
  • 深入學(xué)習(xí)Android?ANR?的原理分析及解決辦法

    深入學(xué)習(xí)Android?ANR?的原理分析及解決辦法

    Android系統(tǒng)中,AMS和WMS會(huì)檢測(cè)App的響應(yīng)時(shí)間,如果App在特定時(shí)間無法相應(yīng)屏幕觸摸或鍵盤輸入時(shí)間,或者特定事件沒有處理完畢,就會(huì)出現(xiàn)ANR。本文將帶領(lǐng)大學(xué)深入學(xué)習(xí)一下ANR的原理及解決辦法,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11

最新評(píng)論

黄龙县| 沂源县| 柘城县| 浑源县| 自治县| 嘉黎县| 金川县| 隆德县| 金塔县| 思茅市| 方正县| 上林县| 光山县| 河南省| 庄浪县| 甘孜| 焦作市| 青阳县| 凌源市| 建湖县| 报价| 独山县| 高唐县| 韶关市| 临沭县| 易门县| 饶阳县| 麻栗坡县| 嘉善县| 武山县| 开封县| 曲阳县| 华坪县| 绥棱县| 吐鲁番市| 昌吉市| 阿拉善左旗| 皋兰县| 寿宁县| 胶南市| 东兴市|