flutter_boost如何接管Navigator

以下分析基于 flutter_boost 分支 feature/flutter_1.9_androidx_upgrade

flutter_boost為了實現(xiàn)每個widget頁面都有一個native端的activity頁面與之對應(yīng)膀篮,那么打開新的flutter頁面時,就指定了特殊的打開頁面方式:

FlutterBoost.singleton.open();

這個函數(shù)的作用就是通知native端华蜒,開始創(chuàng)建activity。當native端來到了

setContentView(createFlutterView());

時忱辅,就會重新進入到flutter側(cè)的ContainerCoordinator類中的"didInitPageContainer"呈昔,其實此時并沒有實質(zhì)上的改變顶捷,就是創(chuàng)建了一個與ContainerLifeCycle.Init對應(yīng)的ContainerSettings。當native側(cè)的代碼進入到onResume()后翰蠢,又會發(fā)送事件進入到flutter側(cè)的"didShowPageContainer"项乒。此時開始了真正意義上的flutter頁面創(chuàng)建。

  bool nativeContainerDidShow(String name, Map params, String pageId) {
    FlutterBoost.containerManager
        ?.showContainer(_createContainerSettings(name, params, pageId));
    performContainerLifeCycle(_createContainerSettings(name, params, pageId),
        ContainerLifeCycle.Appear);
    return true;
  }

因此需要重點關(guān)注ContainerManager中的showContainer()梁沧。在這個方法中會先判斷_onStage是不是就是要顯示的頁面板丽,如果不是就從_offStage中查找。其中_onStage定義為當前正在顯示的頁面。_offStage是存放不是正在顯示的頁面的集合埃碱。如果在_offStage中查找不到猖辫,就會進入pushContainer()

  void pushContainer(BoostContainerSettings settings) {
    ……

    _offstage.add(_onstage);
    _onstage = BoostContainer.obtain(widget.initNavigator, settings);

    setState(() {});

   ……
  }

這里新創(chuàng)建了一個BoostContainer。并且賦值給了_onStage砚殿,然后通過setStage()刷新widgetTree啃憎。由于重寫了setStage(),因此當調(diào)用進入setStage()之后似炎,又進入了_refreshOverlayEntries()辛萍。在該函數(shù)中

void _refreshOverlayEntries() {
    final OverlayState overlayState = _overlayKey.currentState;

    if (overlayState == null) {
      return;
    }

    if (_leastEntries != null && _leastEntries.isNotEmpty) {
      for (_ContainerOverlayEntry entry in _leastEntries) {
        entry.remove();
      }
    }

    final List<BoostContainer> containers = <BoostContainer>[];
    containers.addAll(_offstage);

    assert(_onstage != null, 'Should have a least one BoostContainer');
    containers.add(_onstage);

    _leastEntries = containers
        .map<_ContainerOverlayEntry>(
            (BoostContainer container) => _ContainerOverlayEntry(container))
        .toList(growable: false);
    ///真正的頁面顯示是在這里
    overlayState.insertAll(_leastEntries);
  ……
   
  }

最后一行,真正意義上實現(xiàn)了頁面顯示羡藐。

overlayState.insertAll(_leastEntries);

overlayState是系統(tǒng)Navigator管理的overlay的狀態(tài)贩毕。但是我們自始至終都沒有使用Navigator啊,這個overlayState是如何生效的呢仆嗦?根據(jù)之前的分析我們了解到ContainerManager作為整個flutterModule的根root辉阶,然后提供給了MaterialApp。在ContainerManagerState的build方法中瘩扼,就是直接生成了一個overlay谆甜,返回給了整個flutter使用

  @override
  Widget build(BuildContext context) {
    return Overlay(
      key: _overlayKey,
      initialEntries: const <OverlayEntry>[],
    );
  }

此時我們在_refreshOverlayEntries()中獲取的overlayState正是這個overlay的state。下面是整個流程的偽代碼

class MaterialApp{
  //在main.dart中初始化FlutterBoost時返回的
  builder:BoostContainerManager(initNavigator)
}

class BoostContainerManager{
  builder:Overlay()
}

class _ContainerOverlayEntry extends OverlayEntry{
  builder:BoostContainer.copyWith(initNavigator)
}

class BoostContainer extends Navigator{
  BoostContainerSettings settings;
}

class BoostContainerSettings{
  final WidgetBuilder builder;
  //也就是我們在main.dart中注冊路由時使用的集绰。
  builder:FlutterBoost.singleton.registerPageBuilders();
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末规辱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子栽燕,更是在濱河造成了極大的恐慌罕袋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍岔,死亡現(xiàn)場離奇詭異浴讯,居然都是意外死亡,警方通過查閱死者的電腦和手機付秕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門兰珍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侍郭,“玉大人询吴,你說我怎么就攤上這事×猎” “怎么了猛计?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爆捞。 經(jīng)常有香客問我奉瘤,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任盗温,我火速辦了婚禮藕赞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卖局。我一直安慰自己斧蜕,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布砚偶。 她就那樣靜靜地躺著批销,像睡著了一般。 火紅的嫁衣襯著肌膚如雪染坯。 梳的紋絲不亂的頭發(fā)上均芽,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音单鹿,去河邊找鬼掀宋。 笑死,一個胖子當著我的面吹牛羞反,可吹牛的內(nèi)容都是我干的布朦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼昼窗,長吁一口氣:“原來是場噩夢啊……” “哼是趴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澄惊,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唆途,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掸驱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肛搬,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年毕贼,在試婚紗的時候發(fā)現(xiàn)自己被綠了温赔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡鬼癣,死狀恐怖陶贼,靈堂內(nèi)的尸體忽然破棺而出窝爪,到底是詐尸還是另有隱情意述,我是刑警寧澤烧给,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布性穿,位于F島的核電站唤崭,受9級特大地震影響椿猎,放射性物質(zhì)發(fā)生泄漏碰纬。R本人自食惡果不足惜抬旺,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望聊替。 院中可真熱鬧楼肪,春花似錦、人聲如沸惹悄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俘侠。三九已至象缀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爷速,已是汗流浹背央星。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惫东,地道東北人莉给。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像廉沮,于是被迫代替她去往敵國和親颓遏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 該文章屬于劉小壯原創(chuàng)滞时,轉(zhuǎn)載請注明:劉小壯[http://www.reibang.com/u/2de707c93d...
    劉小壯閱讀 6,817評論 1 30
  • 今天我和哥哥還有媽媽陪爸爸去臨沂辦事卻爸爸看天有點黑叁幢,就帶著我們?nèi)フ揖频曜∠拢伊撕镁闷夯K于找到了曼玩,第二天早晨我和...
    直面人生_0165閱讀 155評論 0 0
  • 《白說》與《看見》 這是2019年,我的的第一份陽光窒百。 某個也似微陽的日子里 我本著買方格本的心黍判,卻走進一家書店 ...
    木易濟慈閱讀 632評論 3 2
  • webcal://p07-calendars.icloud.com/published/2/TbB4otDpTal...
    玥霖霏霏閱讀 144評論 0 0
  • 太容易付出 卻不容易相處 難怪我總是被辜負 太多的領(lǐng)悟 卻太少的幸福 是天生性格太頑固 我行我素那樣又何苦 我又不...
    金音閱讀 161評論 0 3