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

Flutter?RendererBinding作用源碼分析

 更新時間:2022年12月12日 14:58:07   作者:WeninerIo  
這篇文章主要為大家介紹了Flutter?RendererBinding作用和內(nèi)部一些重要的類源碼分析,希望此文能給你帶來收獲.有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

分析

RendererBinding 的作用是負(fù)責(zé)render tree 和flutter engine之間的連接. 我們在啟動App的時候,首先會創(chuàng)建 PiplineOwner ,然后通過platformDispatcher去監(jiān)聽屏幕分辨率變化、系統(tǒng)文字大小變化、亮度、語義等等.最后去初始化RenderView,根據(jù)平臺去處理如幀回調(diào)、鼠標(biāo)、web之類的信息.

 void initInstances() {
    super.initInstances();
    _instance = this;
    _pipelineOwner = PipelineOwner(
      onNeedVisualUpdate: ensureVisualUpdate,
      onSemanticsOwnerCreated: _handleSemanticsOwnerCreated,
      onSemanticsOwnerDisposed: _handleSemanticsOwnerDisposed,
    );
    platformDispatcher
      ..onMetricsChanged = handleMetricsChanged
      ..onTextScaleFactorChanged = handleTextScaleFactorChanged
      ..onPlatformBrightnessChanged = handlePlatformBrightnessChanged
      ..onSemanticsEnabledChanged = _handleSemanticsEnabledChanged
      ..onSemanticsAction = _handleSemanticsAction;
    initRenderView();
    _handleSemanticsEnabledChanged();
    assert(renderView != null);
    addPersistentFrameCallback(_handlePersistentFrameCallback);
    initMouseTracker();
    if (kIsWeb) {
      addPostFrameCallback(_handleWebFirstFrame);
    }
  }

PipelineOwner

這里我們著重講一下PipelineOwner, 官方描述中有這么一句話The pipeline owner manages the rendering pipeline., 也就是說 PipelineOwner幫我們管理著渲染所需要的. 我們根據(jù)PipelineOwner調(diào)用的順序依次講解下它提供的方法.

flushLayout

這個階段將計算每個渲染對象的大小和位置, 渲染對象可能會在繪制或者compositing state 的時候被標(biāo)成dirty,這是什么意思呢? 讓我們回歸到代碼中

  // 持有需要被布局的對象
  List<RenderObject> _nodesNeedingLayout = <RenderObject>[];
{
    非release包運行代碼忽略
    ...
    try {
      // 如果當(dāng)前的節(jié)點需要合成
      while (_nodesNeedingLayout.isNotEmpty) {
        final List<RenderObject> dirtyNodes = _nodesNeedingLayout;
        _nodesNeedingLayout = <RenderObject>[];
        for (final RenderObject node in dirtyNodes..sort((RenderObject a, RenderObject b) => a.depth - b.depth)) {
          if (node._needsLayout && node.owner == this)
            node._layoutWithoutResize();
        }
      }
    } finally {
        ... 
    }
}

代碼中可以看到, 如果 _nodesNeedingLayout 中對象不為空.說明當(dāng)前需要被布局,計算其大小.我們可以看到在依次處理節(jié)點時,最后一步是執(zhí)行 _layoutWithoutResize() ,這個方法調(diào)用的本質(zhì)實際上也就是 performLayout(). 那么, performLayout() 做了什么呢? 如果對自定義布局有過了解, 通常我們在實現(xiàn) performLayout() 的時候.會先去 layout widget . 然后去通過position將widget 定位. 確定好widget在父widget中的相對位置.

flushCompositingBits

這個階段中, 每個渲染對象都會了解其子對象是否需要合成.在繪制的階段選擇如何實現(xiàn)視覺效果. 這里實際上也就是標(biāo)記所有的子對象是否需要合成

  void flushCompositingBits() {
    ...
    _nodesNeedingCompositingBitsUpdate.sort((RenderObject a, RenderObject b) => a.depth - b.depth);
    for (final RenderObject node in _nodesNeedingCompositingBitsUpdate) {
      if (node._needsCompositingBitsUpdate && node.owner == this)
        node._updateCompositingBits();
    }
    _nodesNeedingCompositingBitsUpdate.clear();
   ...
  }

flushPaint

在這個階段,我們將會真正的繪制出Layer

  void flushPaint() {
    ...
    try {
      final List<RenderObject> dirtyNodes = _nodesNeedingPaint;
      _nodesNeedingPaint = <RenderObject>[];
      // Sort the dirty nodes in reverse order (deepest first).
      for (final RenderObject node in dirtyNodes..sort((RenderObject a, RenderObject b) => b.depth - a.depth)) {
        ...
        if (node._needsPaint && node.owner == this) {
          if (node._layerHandle.layer!.attached) {
            PaintingContext.repaintCompositedChild(node);
          } else {
            node._skippedPaintingOnLayer();
          }
        }
      }
      ...
    } finally {
      ...
    }
  }

在繪制的時候?qū)袛喈?dāng)前的layer是否attached,如果不是attched的狀態(tài).則說明當(dāng)前的layer已經(jīng)調(diào)用detach方法,因此不再需要繪制.所以會跳過繪制,執(zhí)行 _skippedPaintingOnLayer() 的方法. 如果是attached的狀態(tài),則需要調(diào)用 repaintCompositedChild() 的方法

flushSemantics

最后,如果啟用了語義. 這個階段將會編譯渲染對象的語義,這里就不過多介紹了.

initRenderView

如果說還有比較重要的方法需要講解, 那么就是 initRenderView() 這個方法了.這里將會創(chuàng)建一個 RenderView的對象作為RenderObject的根 ,同時對它進(jìn)行初始化.

  void initRenderView() {
    renderView = RenderView(configuration: createViewConfiguration(), window: window);
    // 準(zhǔn)備第一幀啟動渲染通道. 這里只會調(diào)用一次.
    renderView.prepareInitialFrame();
  }

在 PrepareInitalFrame() 中, 我們通過 scheduleInitialLayout和scheduleInitialPaint , 安排微事務(wù)隊列盡可能快的處理layout和paint.

scheduleInitialLayout

在這個階段,主要是將owner的_nodesNeedingLayout 對象中加入這個初始化的renderview.

scheduleInitialPaint

這個階段中, 我們將_layerHandle 中的layer 賦值成當(dāng)前l(fā)ayer.并在owner中加入 _nodesNeedingPaint .

  void scheduleInitialPaint(ContainerLayer rootLayer) {
    _layerHandle.layer = rootLayer;
    owner!._nodesNeedingPaint.add(this);
  }

今天的RendererBinding源碼分析就暫告一個段落了,它主要是負(fù)責(zé)了測量布局、繪制之類的方法. 作為一個入口還是有了解的必要的, 建議大家有時間可以多看看.

以上就是Flutter RendererBinding作用源碼分析的詳細(xì)內(nèi)容,更多關(guān)于Flutter RendererBinding的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • iOS 防止按鈕多次點擊造成多次響應(yīng)的方法

    iOS 防止按鈕多次點擊造成多次響應(yīng)的方法

    這篇文章主要介紹了iOS 防止按鈕多次點擊造成多次響應(yīng)的方法的相關(guān)資料,這里對多次點擊造成的響應(yīng)提供了解決辦法,需要的朋友可以參考下
    2016-11-11
  • IOS 的彈性滾動解決方案

    IOS 的彈性滾動解決方案

    所謂彈性滾動就是指在翻動長頁面手指離開時,由慢到塊,由快到慢的過度。這篇文章主要介紹了IOS 的彈性滾動解決方案,需要的朋友可以參考下
    2016-10-10
  • iOS創(chuàng)建對象的不同姿勢詳解

    iOS創(chuàng)建對象的不同姿勢詳解

    這篇文章主要介紹了iOS創(chuàng)建對象的不同姿勢,文中介紹的很詳細(xì),對大家具有一定的參考價值,有需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-02-02
  • 為按鈕位置配置不同的IOS背景

    為按鈕位置配置不同的IOS背景

    這篇文章主要介紹了為按鈕位置配置不同的IOS背景,面對多個按鈕如何配置不同的IOS背景,需要的朋友可以參考下
    2015-07-07
  • NSURLSession跨域重定向透傳HTTP Header問題解決

    NSURLSession跨域重定向透傳HTTP Header問題解決

    這篇文章主要為大家介紹了NSURLSession跨域重定向透傳HTTP Header問題解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • MacOS系統(tǒng)下Unity啟動黑屏的解決方法

    MacOS系統(tǒng)下Unity啟動黑屏的解決方法

    最近發(fā)現(xiàn)了一個問題,unity一打開就黑屏,通過查找相關(guān)的資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于在MacOS系統(tǒng)下Unity啟動黑屏的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-01-01
  • Xcode中代碼注釋編寫的一些小技巧

    Xcode中代碼注釋編寫的一些小技巧

    如何在 Xcode 中編寫規(guī)范注釋,規(guī)范注釋可以在Xcode的快速幫助檢查器(quickheliector)中顯示,這篇文章主要給大家介紹了關(guān)于Xcode中代碼注釋編寫的一些小技巧,需要的朋友可以參考下
    2021-10-10
  • iOS 8使用UIBlurEffect實現(xiàn)毛玻璃特效

    iOS 8使用UIBlurEffect實現(xiàn)毛玻璃特效

    這篇文章主要為大家詳細(xì)介紹了iOS 8使用UIBlurEffect類和UIVisualEffectView類實現(xiàn)毛玻璃特效,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • iOS實現(xiàn)去除html標(biāo)簽的方法匯總

    iOS實現(xiàn)去除html標(biāo)簽的方法匯總

    相信大家在做網(wǎng)站的時候,經(jīng)常會遇到去除html標(biāo)簽的問題,下面這篇文章主要給大家總結(jié)介紹了關(guān)于iOS如何實現(xiàn)去除html標(biāo)簽的一些方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • iOS應(yīng)用開發(fā)中使用NSLocale類實現(xiàn)對象信息的本地化

    iOS應(yīng)用開發(fā)中使用NSLocale類實現(xiàn)對象信息的本地化

    這篇文章主要介紹了iOS應(yīng)用開發(fā)中使用NSLocale類實現(xiàn)對象信息的本地化的方法,能夠?qū)r間和貨幣等格式化為與系統(tǒng)本地設(shè)置相同的偏好,需要的朋友可以參考下
    2016-05-05

最新評論

泸溪县| 六盘水市| 新密市| 康保县| 乌拉特前旗| 南安市| 卢龙县| 永丰县| 湾仔区| 卢氏县| 克山县| 亳州市| 三明市| 清河县| 乌鲁木齐县| 紫金县| 乌兰县| 昌黎县| 南汇区| 张家口市| 衡水市| 高淳县| 航空| 和政县| 留坝县| 福清市| 巴彦淖尔市| 阿图什市| 平度市| 瑞金市| 航空| 鹤壁市| 长武县| 襄城县| 和田市| 晋州市| 安远县| 漯河市| 桑植县| 托克逊县| 吴桥县|