国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

詳解flutter刷新流程,讓你的應(yīng)用更流暢

這篇具有很好參考價(jià)值的文章主要介紹了詳解flutter刷新流程,讓你的應(yīng)用更流暢。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本文已授權(quán)公眾號(hào)【縵圖技術(shù)團(tuán)隊(duì)】發(fā)布

詳解flutter刷新流程,讓你的應(yīng)用更流暢

一、概述

Flutter?是谷歌推出的高性能、跨端UI框架,可以通過一套代碼,支持?iOS、AndroidWindows/MAC/Linux?等多個(gè)平臺(tái),且能達(dá)到原生性能。Flutter?也可以與平臺(tái)原生代碼進(jìn)行混合開發(fā),其更新迭代速度很快,技術(shù)發(fā)展也日趨成熟,如今已經(jīng)有很多公司在使用這種新跨端技術(shù)。我們知道在?flutter?中可以使用?setState()?來刷新?StatefulWidget?的?UI,這會(huì)遍歷調(diào)用子?Widget?的?build()?重構(gòu)視圖。當(dāng)一個(gè)頁面內(nèi)容比較復(fù)雜時(shí),會(huì)包含多個(gè)?widget,如果直接調(diào)用根組件的?setState(),會(huì)遍歷所有子?Widget?的?build(),刷新整個(gè)頁面,這樣會(huì)造成很多不必要的開銷,刷新的成本相對較大。如果數(shù)據(jù)很多接口響應(yīng)又慢的話,還會(huì)有界面閃爍的現(xiàn)象。那么?flutter?到底是如何實(shí)現(xiàn)界面刷新的,調(diào)用?setState({})后?flutter?framework?到底做了哪些操作?接下來我們一起來揭開?flutter?刷新界面的神秘面紗。

二、Flutter 渲染中的三棵樹

在了解flutter的刷新機(jī)制之前,先來看看flutter渲染過程中的三棵樹。在Flutter的渲染過程中由Widget,Element,RenderObject這個(gè)三個(gè)元素組成三棵樹。Widget控件樹,Element?元素樹,RenderObject?渲染樹。Widget內(nèi)部調(diào)用?createElement()會(huì)創(chuàng)建對應(yīng)的?ElementElement內(nèi)部調(diào)用?createRenderObject()會(huì)創(chuàng)建對應(yīng)的?RenderObject,所以我們只需要關(guān)心?Widget?就可以快速的構(gòu)建視圖界面了。為什么使用三棵樹而不是?Widget?RenderObject?兩棵樹呢?這里是為了復(fù)用?Element?提升渲染性能,因?yàn)?Widget?面向業(yè)務(wù)它的改變會(huì)很頻繁,如果根據(jù)?Widget?直接生成?RenderObject?會(huì)導(dǎo)致渲染性能下降。

flutter 刷新頁面,flutter開發(fā),flutter,刷新
flutter 三棵樹依賴關(guān)系

RenderObject?渲染樹在上屏前會(huì)生成一棵?Layer?樹去進(jìn)行屏幕渲染。

三、刷新流程分析

在開始流程分析之前,先上個(gè)圖來梳理下整個(gè)刷新流程,腦海里對整體先有個(gè)初步認(rèn)識(shí),這樣再跟著下面的源碼一步步往里深入分析,思路會(huì)更加清晰一些:

flutter 刷新頁面,flutter開發(fā),flutter,刷新
setState() 刷新流程

對整體的刷新流程有了大概的認(rèn)識(shí)之后,我們對照著上面這個(gè)圖的流程來看看調(diào)用setState({})之后,系統(tǒng)具體都做了哪些操作:

注:

setState() 源碼位于 flutetr_sdk/packages/flutter/lib/src/widgets/framework.dart 文件中

本文源碼基于 Flutter 3.3.8 Dart 2.18.4 ? DevTools 2.15.0

  @protected
  void setState(VoidCallback fn) {
    assert(fn != null);
    assert(() {
      if (_debugLifecycleState == _StateLifecycle.defunct) {
        throw FlutterError.fromParts(<DiagnosticsNode>[
    			// 省略不重要代碼
        ]);
      }
      if (_debugLifecycleState == _StateLifecycle.created && !mounted) {
        throw FlutterError.fromParts(<DiagnosticsNode>[
    			// 省略不重要代碼
        ]);
      }
      return true;
    }());
    final Object? result = fn() as dynamic;
    ...
    // 省略不重要代碼
    _element!.markNeedsBuild();
  }

setState()?中傳入的回調(diào)函數(shù)是立刻同步執(zhí)行的,不能是異步的。該方法前面主要是 assert 部分的一些校驗(yàn)邏輯,不允許傳入的回調(diào)函數(shù)為null且不能為異步函數(shù),這里有一個(gè)點(diǎn)需要注意:在?widget?構(gòu)造函數(shù)中以及?dispose?調(diào)用之后,不允許再調(diào)用?setState()?方法去刷新界面,可以在調(diào)用前考慮使用?mounted?標(biāo)志來檢測該?widget?是否還掛載在?文章來源地址http://www.zghlxwxcb.cn/news/detail-551233.html

到了這里,關(guān)于詳解flutter刷新流程,讓你的應(yīng)用更流暢的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 讓你的微信小程序?qū)τ脩舾佑押茫荷侠虞d和下拉刷新就是關(guān)鍵

    讓你的微信小程序?qū)τ脩舾佑押茫荷侠虞d和下拉刷新就是關(guān)鍵

    上拉加載和下拉刷新是小程序開發(fā)的常見需求。本文將介紹如何在微信小程序中實(shí)現(xiàn)上拉加載和下拉刷新的功能,為用戶帶來更加流暢、便捷的使用體驗(yàn)。 實(shí)現(xiàn)效果如下: 1. 首先需要在使用到的 json 文件下配置 \\\"enablePullDownRefresh\\\": true 2. 在 js 文件中加上觸底函數(shù)跟上拉函數(shù)

    2024年02月11日
    瀏覽(24)
  • 分享 7 個(gè)有用的 Flutter 庫,讓你的開發(fā)生活更輕松

    分享 7 個(gè)有用的 Flutter 庫,讓你的開發(fā)生活更輕松

    讓你的 Flutter 開發(fā)更高效 為什么要編寫自定義功能,當(dāng)你可以使用庫呢?庫是開發(fā)者最好的朋友和救命稻草。在我看來,一個(gè)好的項(xiàng)目應(yīng)該充分利用一些最好的可用庫。 本文是有關(guān) Flutter 中很棒的庫系列文章的一部分,我總結(jié)了7個(gè) Flutter 庫,這些庫將有助于您在開發(fā)過程中

    2024年02月17日
    瀏覽(19)
  • Flutter應(yīng)用發(fā)布流程詳解:從開發(fā)到上架一站式指南

    Flutter應(yīng)用發(fā)布流程詳解:從開發(fā)到上架一站式指南

    Flutter是一款由Google推出的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)框架,其強(qiáng)大的性能和流暢的用戶體驗(yàn)使其備受開發(fā)者青睞。然而,開發(fā)一款應(yīng)用只是第一步,將其成功上架到蘋果商店才是實(shí)現(xiàn)商業(yè)目標(biāo)的關(guān)鍵一步。本文將詳細(xì)介紹如何使用Flutter將應(yīng)用程序上架到蘋果商店,讓您的應(yīng)用更快

    2024年04月09日
    瀏覽(20)
  • Flutter頁面刷新失???看看是不是這個(gè)原因

    Flutter頁面刷新失?。靠纯词遣皇沁@個(gè)原因

    我用flutter開發(fā)了一個(gè)頁面,頁面上有一些自己寫的控件A,A控件里有一個(gè)button,我點(diǎn)擊這個(gè)A控件里的button的時(shí)候,直接在onPressed里調(diào)用setState發(fā)現(xiàn)頁面并沒有刷新。 要實(shí)現(xiàn)控件A所在頁面的整體刷新要怎么實(shí)現(xiàn)呢? 在Flutter中,要實(shí)現(xiàn)點(diǎn)擊控件A中的按鈕后刷新整個(gè)頁面,你可

    2024年02月05日
    瀏覽(31)
  • 用上Parallel讓你的.NET應(yīng)用效率飆升

    簡介 .NET Framework 和 .NET Core 提供了強(qiáng)大的并行編程支持,其中一個(gè)核心工具就是Parallel類。Parallel類是.NET Framework4.0推出的新特性。Parallel類使得在多核系統(tǒng)上執(zhí)行并行操作變得更加簡單和高效。通過并行編程,可以充分利用現(xiàn)代計(jì)算機(jī)系統(tǒng)的硬件資源,提高應(yīng)用程序的性能。

    2024年02月05日
    瀏覽(25)
  • JUnit 使用詳解,讓你的項(xiàng)目健壯起來

    JUnit 是 Java 中最為流行的測試框架之一,用于對單元測試進(jìn)行自動(dòng)化測試。本文將全面介紹 JUnit 的相關(guān)概念和使用方式,并提供多種類型的代碼示例。 1.1 JUnit 概述 JUnit 是一個(gè)基于 Java 語言的測試框架,最初是由 Kent Beck 和 Erich Gamma 開發(fā)的。JUnit 提供了一系列的 API ,可以幫

    2024年02月07日
    瀏覽(20)
  • C語言柔性數(shù)組詳解:讓你的程序更靈活

    C語言柔性數(shù)組詳解:讓你的程序更靈活

    仔細(xì)觀察下面的代碼,有沒有看出哪里不對勁? 還有另外一種寫法: 你應(yīng)該一眼就看到了,結(jié)構(gòu)體的最后一個(gè)成員數(shù)組的寫法是 int arr[]; 或者是 int arr[0] ,這兩種寫法是等價(jià)的,意思是這個(gè)數(shù)組的大小是 不確定的、未知的、可以變化的 。 C99允許這種特殊的結(jié)構(gòu)體存在。這

    2024年02月09日
    瀏覽(20)
  • 輕松搞定Spring集成緩存,讓你的應(yīng)用程序飛起來!

    輕松搞定Spring集成緩存,讓你的應(yīng)用程序飛起來!

    主頁傳送門:?? 傳送 ??Spring 提供了對緩存的支持,允許你將數(shù)據(jù)存儲(chǔ)在緩存中以提高應(yīng)用程序的性能。Spring 緩存抽象基于 Java Caching API,但提供了更簡單的編程模型和更高級(jí)的功能。 ??Spring 集成緩存提供了一種方便的方式來使用緩存,從而提高應(yīng)用程序的性能。Spr

    2024年02月07日
    瀏覽(25)
  • 6種打包Python代碼的方法,讓你的程序變成exe應(yīng)用

    Python是一種高級(jí)編程語言,它具有易學(xué)易用、跨平臺(tái)等優(yōu)點(diǎn),因此在開發(fā)中得到了廣泛的應(yīng)用。 然而,Python代碼需要在Python解釋器中運(yùn)行,這對于一些用戶來說可能不太方便。 因此,將Python代碼打包成可執(zhí)行文件(exe)是一種很好的解決方案。 本文將介紹6種將Python代碼打包

    2024年01月18日
    瀏覽(21)
  • 6種打包Python代碼的方法,讓你的程序變成exe應(yīng)用!

    Python是一種高級(jí)編程語言,它具有易學(xué)易用、跨平臺(tái)等優(yōu)點(diǎn),因此在開發(fā)中得到了廣泛的應(yīng)用。 然而,Python代碼需要在Python解釋器中運(yùn)行,這對于一些用戶來說可能不太方便。 因此,將Python代碼打包成可執(zhí)行文件(exe)是一種很好的解決方案。 本文將介紹6種將Python代碼打包

    2024年02月16日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包