flutter_boost如何接管Navigator

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

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

FlutterBoost.singleton.open();

這個(gè)函數(shù)的作用就是通知native端,開(kāi)始創(chuàng)建activity。當(dāng)native端來(lái)到了

setContentView(createFlutterView());

時(shí),就會(huì)重新進(jìn)入到flutter側(cè)的ContainerCoordinator類(lèi)中的"didInitPageContainer",其實(shí)此時(shí)并沒(méi)有實(shí)質(zhì)上的改變,就是創(chuàng)建了一個(gè)與ContainerLifeCycle.Init對(duì)應(yīng)的ContainerSettings。當(dāng)native側(cè)的代碼進(jìn)入到onResume()后,又會(huì)發(fā)送事件進(jìn)入到flutter側(cè)的"didShowPageContainer"。此時(shí)開(kāi)始了真正意義上的flutter頁(yè)面創(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;
  }

因此需要重點(diǎn)關(guān)注ContainerManager中的showContainer()。在這個(gè)方法中會(huì)先判斷_onStage是不是就是要顯示的頁(yè)面,如果不是就從_offStage中查找。其中_onStage定義為當(dāng)前正在顯示的頁(yè)面。_offStage是存放不是正在顯示的頁(yè)面的集合。如果在_offStage中查找不到,就會(huì)進(jìn)入pushContainer()

  void pushContainer(BoostContainerSettings settings) {
    ……

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

    setState(() {});

   ……
  }

這里新創(chuàng)建了一個(gè)BoostContainer。并且賦值給了_onStage,然后通過(guò)setStage()刷新widgetTree。由于重寫(xiě)了setStage(),因此當(dāng)調(diào)用進(jìn)入setStage()之后,又進(jìn)入了_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);
    ///真正的頁(yè)面顯示是在這里
    overlayState.insertAll(_leastEntries);
  ……
   
  }

最后一行,真正意義上實(shí)現(xiàn)了頁(yè)面顯示。

overlayState.insertAll(_leastEntries);

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

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

此時(shí)我們?cè)赺refreshOverlayEntries()中獲取的overlayState正是這個(gè)overlay的state。下面是整個(gè)流程的偽代碼

class MaterialApp{
  //在main.dart中初始化FlutterBoost時(shí)返回的
  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;
  //也就是我們?cè)趍ain.dart中注冊(cè)路由時(shí)使用的。
  builder:FlutterBoost.singleton.registerPageBuilders();
}

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

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

  • 該文章屬于劉小壯原創(chuàng),轉(zhuǎn)載請(qǐng)注明:劉小壯[http://www.itdecent.cn/u/2de707c93d...
    劉小壯閱讀 7,059評(píng)論 1 30
  • 今天我和哥哥還有媽媽陪爸爸去臨沂辦事卻爸爸看天有點(diǎn)黑,就帶著我們?nèi)フ揖频曜∠?,找了好久,終于找到了,第二天早晨我和...
    直面人生_0165閱讀 188評(píng)論 0 0
  • 《白說(shuō)》與《看見(jiàn)》 這是2019年,我的的第一份陽(yáng)光。 某個(gè)也似微陽(yáng)的日子里 我本著買(mǎi)方格本的心,卻走進(jìn)一家書(shū)店 ...
    木易濟(jì)慈閱讀 741評(píng)論 3 2
  • webcal://p07-calendars.icloud.com/published/2/TbB4otDpTal...
    玥霖霏霏閱讀 163評(píng)論 0 0
  • 太容易付出 卻不容易相處 難怪我總是被辜負(fù) 太多的領(lǐng)悟 卻太少的幸福 是天生性格太頑固 我行我素那樣又何苦 我又不...
    金音閱讀 176評(píng)論 0 3

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