Navigator基礎(chǔ)理解

了解了navigator的大致原理,Navigator是需要MaterialApp支持的,在其內(nèi)部才能使用。

Navigator也是一個Widget,他提供一個of方法使得子孫widget可以取到他的state。

static NavigatorState of(
    BuildContext context, {
      bool rootNavigator = false,
      bool nullOk = false,
    }) {...
        : context.ancestorStateOfType(const TypeMatcher<NavigatorState>());
        ...
    return navigator;
  }

of方法中調(diào)用ancestorStateOfType方法,向上遍歷父element,找到Navigator的element就把他的state返回,state中封裝了各種push、pop方法

@override
State ancestorStateOfType(TypeMatcher matcher) {
  assert(_debugCheckStateIsActiveForAncestorLookup());
  Element ancestor = _parent;
  while (ancestor != null) {
    if (ancestor is StatefulElement && matcher.check(ancestor.state))
      break;
    ancestor = ancestor._parent;
  }
  final StatefulElement statefulAncestor = ancestor;
  return statefulAncestor?.state;
}

為啥Navigator可以隨意增刪widget呢,其實他內(nèi)部維護了一個用Overlay擴展的Stack,push粗糙的說其實就是往stack中配置多一個widget,然后rebuild。但是Stack是會把整個widgetList都進行繪制的,這樣連續(xù)push頁面后,會爆炸的。Overlay就是用來解決Stack的不足的,Overlay會把push的頁面進行分類,是否需是否透明(如果透明,則下層widget也要參與繪制,反之不用)、要保存狀態(tài)(如果不需要,那么在上層widget不透明的情況下,可以直接扔掉)。分類后,只有需要繪制的widget會按照順序配置到Stack中rebuild。

以上是Navigator工作的簡要描述。

通過了解Navigator的工作原理,可以看到,核心是Overlay,要自定義一個widget支持布局push、pop(類似安卓碎片的效果),那么完全可以把Overlay剝出來,Overlay本身支持of方法從子widget中獲取他的state,他的state也提供了insert方法,可以插入一個widget。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容