diff --git a/_img/posts/2020-03-25-01.jpg b/_img/posts/2020-03-25-01.jpg new file mode 100644 index 0000000..53a3bd3 Binary files /dev/null and b/_img/posts/2020-03-25-01.jpg differ diff --git a/_posts/2016-05-11-nio.md b/_posts/2016-05-11-nio.md index d6f59dd..8cda68b 100644 --- a/_posts/2016-05-11-nio.md +++ b/_posts/2016-05-11-nio.md @@ -1,6 +1,6 @@ --- layout: post -title: "Java NIO 简明教程" +title: "翻译|Java NIO 简明教程" link: "books/nio" target: featured-img: 2018-03-28-02 diff --git a/_posts/2018-03-28-next.md b/_posts/2018-03-28-next.md index 41f597d..c35559b 100644 --- a/_posts/2018-03-28-next.md +++ b/_posts/2018-03-28-next.md @@ -1,9 +1,8 @@ --- layout: post -title: "Next助手 for OSX" +title: "工具|App启动测速助手Next" featured-img: 2018-03-28-05 -target: -draft: true -link: "app/next" -summary: "基于Electron框架开发的OSX桌面助手小工具" +target: _blank +link: "https://github.com/hacktons/next-osx" +summary: "基于Electron框架开发的Mac应用,用于App启动速度傻瓜式评测,同时提供了针对Android设备的一些常用操作" --- \ No newline at end of file diff --git a/_posts/2018-03-28-performance.md b/_posts/2018-03-28-performance.md index ce6dd76..1533b23 100644 --- a/_posts/2018-03-28-performance.md +++ b/_posts/2018-03-28-performance.md @@ -2,6 +2,7 @@ layout: post title: "Android 性能优化漫谈" link: "books/performance" +draft: true target: featured-img: 2018-03-28-06 summary: "编写《Android性能优化漫谈》专栏,是一次全面的总结和自我审视的过程。希望对有志于深入学习性能优化的读者有所增益。 diff --git a/_posts/2019-02-28-senior.md b/_posts/2019-02-28-senior.md index 673c0db..45ee4db 100644 --- a/_posts/2019-02-28-senior.md +++ b/_posts/2019-02-28-senior.md @@ -1,7 +1,8 @@ --- layout: post -title: "大前端系列专题" +title: "草稿|大前端系列专题" link: "books/dev" +draft: true target: featured-img: 2019-03-06-01 summary: "技术在不断演变,每个开发者都应形成自己的知识图谱,并根据趋势不断自我调整。本系列为知识体系汇总,偏重于大前端方向" diff --git a/_posts/2019-10-23-appbar.md b/_posts/2019-10-23-appbar.md new file mode 100644 index 0000000..ec3c4e2 --- /dev/null +++ b/_posts/2019-10-23-appbar.md @@ -0,0 +1,8 @@ +--- +layout: post +title: "Flutter|ConvexAppBar导航栏" +link: "https://bar.hacktons.cn" +target: _blank +featured-img: 2019-03-06-01 +summary: "ConvexBottomBar是一个底部导航栏组件,用于展现凸起的TAB效果,支持多种内置样式与动画交互。你可以在https://appbar.codemagic.app上找到在线样例" +--- \ No newline at end of file diff --git a/_posts/2020-03-25-boost.md b/_posts/2020-03-25-boost.md new file mode 100644 index 0000000..a5d2441 --- /dev/null +++ b/_posts/2020-03-25-boost.md @@ -0,0 +1,9 @@ +--- +layout: post +title: "连载|Flutter Boost核心原理" +link: "books/boost" +draft: true +target: +featured-img: 2020-03-25-01 +summary: "从源码解读Flutter Boost的实现原理和核心点,希望对Flutter开发者更好地掌握混合开发有所增益" +--- \ No newline at end of file diff --git a/_posts/2021-01-11-fair.md b/_posts/2021-01-11-fair.md new file mode 100644 index 0000000..8be8615 --- /dev/null +++ b/_posts/2021-01-11-fair.md @@ -0,0 +1,8 @@ +--- +layout: post +title: "Flutter|动态化框架Flutter Fair" +link: "https://fair.hacktons.cn" +target: _blank +featured-img: 2020-03-25-01 +summary: "Fair是为Flutter设计的,轻量级动态化框架。目前处于早期阶段,主要用于Flutter布局的动态化" +--- \ No newline at end of file diff --git a/assets/img/posts/2020-03-25-01.jpeg b/assets/img/posts/2020-03-25-01.jpeg new file mode 100644 index 0000000..53a3bd3 Binary files /dev/null and b/assets/img/posts/2020-03-25-01.jpeg differ diff --git a/assets/img/posts/2020-03-25-01_md.jpeg b/assets/img/posts/2020-03-25-01_md.jpeg new file mode 100644 index 0000000..20b31f2 Binary files /dev/null and b/assets/img/posts/2020-03-25-01_md.jpeg differ diff --git a/assets/img/posts/2020-03-25-01_placehold.jpeg b/assets/img/posts/2020-03-25-01_placehold.jpeg new file mode 100644 index 0000000..227c801 Binary files /dev/null and b/assets/img/posts/2020-03-25-01_placehold.jpeg differ diff --git a/assets/img/posts/2020-03-25-01_sm.jpeg b/assets/img/posts/2020-03-25-01_sm.jpeg new file mode 100644 index 0000000..c05cdfe Binary files /dev/null and b/assets/img/posts/2020-03-25-01_sm.jpeg differ diff --git a/assets/img/posts/2020-03-25-01_thumb.jpeg b/assets/img/posts/2020-03-25-01_thumb.jpeg new file mode 100644 index 0000000..8cb0850 Binary files /dev/null and b/assets/img/posts/2020-03-25-01_thumb.jpeg differ diff --git a/assets/img/posts/2020-03-25-01_thumb@2x.jpeg b/assets/img/posts/2020-03-25-01_thumb@2x.jpeg new file mode 100644 index 0000000..0b0f551 Binary files /dev/null and b/assets/img/posts/2020-03-25-01_thumb@2x.jpeg differ diff --git "a/books/boost/Flutter Boost\346\217\255\347\247\230-Widget\350\247\206\345\233\276\346\240\210\347\232\204\347\256\241\347\220\206.md" "b/books/boost/Flutter Boost\346\217\255\347\247\230-Widget\350\247\206\345\233\276\346\240\210\347\232\204\347\256\241\347\220\206.md" new file mode 100644 index 0000000..f13c964 --- /dev/null +++ "b/books/boost/Flutter Boost\346\217\255\347\247\230-Widget\350\247\206\345\233\276\346\240\210\347\232\204\347\256\241\347\220\206.md" @@ -0,0 +1,12 @@ +## Flutter Boost--多视图栈管理揭秘 + +> + +## 疑问验证 + +到这里,boost在dart侧的核心逻辑基本分析完毕。但是我们还遗留了两个问题未解答: + +> 问题1:加上目标页面已经存在于后台队列,那么如果要显示,是不是应该把他前面的页面全部出栈,然后将他显示出来? + +> 问题3:屏蔽了setState的super之后,没有副作用吗?Element如何进行待刷新标记? + diff --git a/books/boost/assets/Screen Shot 2020-03-18 at 7.08.10 PM.png b/books/boost/assets/Screen Shot 2020-03-18 at 7.08.10 PM.png new file mode 100644 index 0000000..939af69 Binary files /dev/null and b/books/boost/assets/Screen Shot 2020-03-18 at 7.08.10 PM.png differ diff --git a/books/boost/assets/boost-channel.png b/books/boost/assets/boost-channel.png new file mode 100644 index 0000000..9a8dd65 Binary files /dev/null and b/books/boost/assets/boost-channel.png differ diff --git a/books/boost/assets/boost-manager.png b/books/boost/assets/boost-manager.png new file mode 100644 index 0000000..dd8180a Binary files /dev/null and b/books/boost/assets/boost-manager.png differ diff --git a/books/boost/assets/boost-overlay.png b/books/boost/assets/boost-overlay.png new file mode 100644 index 0000000..1eff643 Binary files /dev/null and b/books/boost/assets/boost-overlay.png differ diff --git a/books/boost/assets/boost-version-compact.png b/books/boost/assets/boost-version-compact.png new file mode 100644 index 0000000..66eb0a0 Binary files /dev/null and b/books/boost/assets/boost-version-compact.png differ diff --git a/books/boost/assets/boost_widget_stack.png b/books/boost/assets/boost_widget_stack.png new file mode 100644 index 0000000..a586cb0 Binary files /dev/null and b/books/boost/assets/boost_widget_stack.png differ diff --git a/books/boost/assets/boost_widget_stack2.png b/books/boost/assets/boost_widget_stack2.png new file mode 100644 index 0000000..4725fef Binary files /dev/null and b/books/boost/assets/boost_widget_stack2.png differ diff --git a/books/boost/assets/clean-boost.png b/books/boost/assets/clean-boost.png new file mode 100644 index 0000000..a4ff45e Binary files /dev/null and b/books/boost/assets/clean-boost.png differ diff --git a/books/boost/assets/container.png b/books/boost/assets/container.png new file mode 100644 index 0000000..f9e7bd8 Binary files /dev/null and b/books/boost/assets/container.png differ diff --git a/books/boost/assets/duang.jpeg b/books/boost/assets/duang.jpeg new file mode 100644 index 0000000..868e2d1 Binary files /dev/null and b/books/boost/assets/duang.jpeg differ diff --git a/books/boost/assets/wechat-img-boost.jpeg b/books/boost/assets/wechat-img-boost.jpeg new file mode 100644 index 0000000..9aa0f0a Binary files /dev/null and b/books/boost/assets/wechat-img-boost.jpeg differ diff --git a/books/boost/boost-architecture.html b/books/boost/boost-architecture.html new file mode 100644 index 0000000..e127e00 --- /dev/null +++ b/books/boost/boost-architecture.html @@ -0,0 +1,577 @@ + + + + + + + Boost整体架构分析 · Flutter Boost核心原理Dart篇 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ +
+ + + + + + + + +
+
+ +
+
+ +
+ +

Boost整体架构分析

+

既然是Flutter开发框架,我们首先要知道的就是通过Boost进行业务开发时,他的整体技术架构是怎么样的。除了闲鱼团队的宣讲文章,我们还需深入到代码内部去了解一些新的概念.

+

Flutter Boost架构

+

首先我们一起看一下整个Boost的架构关系。

+

+

坦白说,第一次看到这张图的时候,有几个感觉:

+
    +
  • 名词多!
  • +
  • 名词很多!!
  • +
  • 名词很多啊!!!
  • +
+

duang

+

后来看到作者又说了句:

+
+

我们想做到把Flutter容器做成浏览器的感觉。填写一个页面地址,然后由容器去管理页面的绘制。

+
+

瞬间感觉Boost高度被原地干拔起来了,这是要和V8引擎比肩么😶。

+

为了让Boost更接地气,我决定把我对源码的理解,重新画一张Low图,让Boost落到地上,避免开发者被整张架构图给"劝退"了。(这里不是吐槽原图,也不代表原图表达有何不当之处)

+

简化boost

+

在整个Boost里面他的核心有两个:

+
    +
  • Native层的引擎复用处理
  • +
  • Dart侧的多视图栈管理
  • +
+

在我们画的那张图中,隐去了关于路由的几个元素和箭头,同时我们把新的名词换为了原生名词。

+

下面我再结合Boost里面的一些新名词,理解他们的实际含义和作用。

+

理解Boost的新概念

+

现在我们通过几个问答来阐述Boost的中核心内容:

+
+

问题1:ContainerManager是工具类还是什么,他的具体代表了什么?

+
+

Container Manager是Flutter容器的管理,提供show,remove等Api。它本身也是一个Widget,通过对外暴露State,提供了API操作。这个Widget内部管理了一个Overlay组件,从而实现了多视图栈的管理。

+
+

问题2:Container和StatefullWidget,StatelessWidget的区别是什么?

+
+

Container就是一个普通的Widget,直接继承了原生Navigator,用于承载页面Widget。可以认为他是用了替换原生的Navigator的。

+
+

问题3:Messaging和Coordinator本质是什么?

+
+

其实就是对MethoChannel的使用,基本可以认为是一个东西的两种表述。

+

小结

+

当我们把Boost架构简化后,可以把目光放到重点上面,其他的枝叶如Flutter View,Route,Channel等,并不是Boost独有的。对Boost的源码分析将在后续章节逐一介绍。

+
+

参考

+ +
powered by Gitbook最近更新 +2020-03-23 +
+ +
+ +
+
+
+ +

results matching ""

+
    + +
    +
    + +

    No results matching ""

    + +
    +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/books/boost/boost-container-manager.html b/books/boost/boost-container-manager.html new file mode 100644 index 0000000..402e2bd --- /dev/null +++ b/books/boost/boost-container-manager.html @@ -0,0 +1,703 @@ + + + + + + + 顶层容器栈的实现 · Flutter Boost核心原理Dart篇 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    + +
    + +
    + + + + + + + + +
    +
    + +
    +
    + +
    + +

    顶层容器栈的实现

    +

    Boost视图栈

    +

    当发生页面切换时,Boost内部通过其自定义的顶层入口,将所有子页面都进行了一次包裹。

    +

    boost-manager

    +

    外层包裹的节点分别是:

    +
    +

    BoostContainerManager => Overlay => BoostContainer

    +
    +

    boost_widget_stack

    +

    当发出页面入栈出栈时,Overlay节点所代表的的数组元素会增加。新增加的页面会插入到Overlay数组的第一个,形式上就是Stack的效果:先进后出。

    +

    boost-overlay

    +

    顶层容器 BoostContainerManager

    +

    这个类的主要是作为入口,负责管理页面路由信息。

    +

    可以看到他定义了针对页面的四种操作:

    +
      +
    • push 入栈
    • +
    • onstage 页面后台
    • +
    • pop 出栈
    • +
    • remove 移除(这个和pop的区别后面分析)
    • +
    +

    视图栈的实现

    +

    整个Manager的页面构建非常简单,就是利用了Overlay组件,实现了页面的层叠。这样每一层自身还可以使用原生的路由栈。

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

    可以预见的时,我们调用的open操作最终也会通过channel再次从native侧回到dart侧,并修改数组元素。

    +
    +

    那么这个channel对应的方法是什么?

    +
    +

    还记得前面我们打印的页面栈切换是的日志么,答案就在其中。我们搜索一下willShowPageContainer这个定义好的方法名,可以找到蛛丝马迹:

    +
    /// container_cordinator.dart
    +Future<dynamic> _onMethodCall(MethodCall call) {
    +    Logger.log("onMetohdCall ${call.method}");
    +  case "willShowPageContainer":
    +      {
    +        String pageName = call.arguments["pageName"];
    +        Map params = call.arguments["params"];
    +        String uniqueId = call.arguments["uniqueId"];
    +        _nativeContainerWillShow(pageName, params, uniqueId);
    +      }
    +      break;
    +}
    +bool _nativeContainerWillShow(String name, Map params, String pageId) {
    +  if (FlutterBoost.containerManager?.containsContainer(pageId) != true) {
    +    FlutterBoost.containerManager
    +      ?.pushContainer(_createContainerSettings(name, params, pageId));
    +  }
    +
    +  //TODO, 需要验证android代码是否也可以移到这里
    +  if (Platform.isIOS) {
    +    try {
    +      final SemanticsOwner owner =
    +        WidgetsBinding.instance.pipelineOwner?.semanticsOwner;
    +      final SemanticsNode root = owner?.rootSemanticsNode;
    +      root?.detach();
    +      root?.attach(owner);
    +    } catch (e) {
    +      assert(false, e.toString());
    +    }
    +  }
    +  return true;
    +}
    +
    +

    对应的dart侧实现位于函数:_nativeContainerWillShow

    +

    我们可以看到,会基于页面的pageid进行前置校验,通过后,则会调用Manager对应State的pushContainer函数,进行页面切换。

    +

    页面入栈实现

    +

    现在我们继续回到Manager上下文,分析对应的函数实现。

    +
    void pushContainer(BoostContainerSettings settings) {
    +  assert(settings.uniqueId != _onstage.settings.uniqueId);
    +  assert(_offstage.every((BoostContainer container) =>
    +                         container.settings.uniqueId != settings.uniqueId));
    +
    +  _offstage.add(_onstage);
    +  _onstage = BoostContainer.obtain(widget.initNavigator, settings);
    +
    +  setState(() {});
    +
    +  for (BoostContainerObserver observer in FlutterBoost
    +       .singleton.observersHolder
    +       .observersOf<BoostContainerObserver>()) {
    +    observer(ContainerOperation.Push, _onstage.settings);
    +  }
    +  Logger.log('ContainerObserver#2 didPush');
    +}
    +
    +

    这个函数做了三件事情:

    +
      +
    • 页面合法性校验,基于页面的唯一标识uniqueId,作用是防止重复入栈。可以结合containsContainer方法。
    • +
    • 将当前的页面加入offstage列表中,重新生成新的目标页面。
    • +
    • 同镇State数据变更,同时触发观察者回调函数的执行。
    • +
    +

    以Example中的页面为例,当我们点击打开第二个Flutter页面后,Widget节点中插入了一个SecondRouteWidget。

    +

    boost_widget_stack2

    +

    当这些完成后打印一行日志,标志着一次页面切换动作完成:

    +
    +
    ContainerObserver#2 didPush
    +
    +

    这里有两个细节指的注意,分别是两个断言处理:

    +
    assert(settings.uniqueId != _onstage.settings.uniqueId);
    +assert(_offstage.every((BoostContainer container) =>
    +    container.settings.uniqueId != settings.uniqueId));
    +
    +

    在执行入栈pushContainer函数前有一个判断:FlutterBoost.containerManager?.containsContainer(pageId) != true

    +

    只有当整个条件满足时才会触发入栈操作,整个条件会屏蔽两种尝试入栈的情况:

    +
      +
    • 当前显示页面已经是需要入栈的页面,规避一个页面id多次调用入栈
    • +
    • 目标页面处于offstage队列中,如果要显示的页面已经在后台队列中,则忽略当次入栈
    • +
    +

    这两个情况,第一个好理解,但是第二个初看起来是有瑕疵的:

    +
    +

    问题1:加上目标页面已经存在于后台队列,那么如果要显示,是不是应该把他前面的页面全部出栈,然后将他显示出来?

    +
    +

    这个疑问我们先放一放,后面再分析。

    +

    页面栈刷新逻辑

    +

    到这里,不知道你有没有疑问,反正我是有的。

    +
    +

    问题2:入栈函数调用setState({})触发了Widget刷新,但是build函数内的依赖关系并没有被改变,如何刷新?

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

    正常来说修改稿state一定是在{}中改变的状态属性,并且该属性会被build直接、间接引用,才能达到刷新目的。

    +

    检索一下Manager的上下文,答案很快就揭晓了:setState函数被重载了。

    +
    @override
    +void setState(VoidCallback fn) {
    +  if (SchedulerBinding.instance.schedulerPhase ==
    +      SchedulerPhase.persistentCallbacks) {
    +    SchedulerBinding.instance.addPostFrameCallback((Duration duration) {
    +      _refreshOverlayEntries();
    +    });
    +  } else {
    +    _refreshOverlayEntries();
    +  }
    +
    +  fn();
    +  //return super.setState(fn);
    +}
    +
    +

    如果当前Flutter正在进程绘制调度,那么将刷新动作延迟加入下一次绘制的回调函数中。根据API注释,可以知道当persisntCallback代表build/layout/paint之一正在被执行

    +
    /// The persistent callbacks (scheduled by
    +/// [WidgetsBinding.addPersistentFrameCallback]) are currently executing.
    +///
    +/// Typically, this is the build/layout/paint pipeline. See
    +/// [WidgetsBinding.drawFrame] and [SchedulerBinding.handleDrawFrame].
    +persistentCallbacks,
    +
    +

    最后执行传入setState的{}函数。所以说对Overlay的操作就是在_refreshOverlayEntries中进行的。这里还有一个注意点,重载的setState屏蔽了super函数。

    +

    在修改Overlay的过程中,主要分几步:

    +
      +
    • 移除现有的overlay节点
    • +
    • 构造新的BoostConatiner数组,并且map转换为OverlayEntry
    • +
    • 最后更新OverlayState并且添加下一帧刷新函数
    • +
    +

    最后一个动作的作用有两个:

    +
      +
    1. 再次通过channel将页面展示实践回传给native,事件名为onShownContainerChanged;
    2. +
    3. 第二个刷新焦点,原因是这里每个OverlayEntry其实都有一个原生的Navigator;
    4. +
    +

    现在我们又新增了一个疑问:

    +
    +

    问题3:屏蔽了setState的super之后,没有副作用吗?Element如何进行待刷新标记?

    +
    +

    +
    powered by Gitbook最近更新 +2020-03-23 +
    + +
    + +
    +
    +
    + +

    results matching ""

    +
      + +
      +
      + +

      No results matching ""

      + +
      +
      +
      + +
      +
      + +
      + + + + + + + + + + + + + + +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/books/boost/boost-container.html b/books/boost/boost-container.html new file mode 100644 index 0000000..49aa13f --- /dev/null +++ b/books/boost/boost-container.html @@ -0,0 +1,627 @@ + + + + + + + 页面容器的视图管理 · Flutter Boost核心原理Dart篇 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + + + + + + + + +
      + +
      + +
      + + + + + + + + +
      +
      + +
      +
      + +
      + +

      页面容器的视图管理

      +

      这一节我们分析页面容器的实现。通过源码对比,可以知道Boost参考了Flutter内部的Navigator实现,进行了相应的调整,更严格的说是继承了Navigator。

      +
      +

      class BoostContainer extends Navigator

      +
      +

      BoostContainer实现

      +

      页面容器的实现类是BoostContainer。类似的,他也新增了一些状态的概念:

      +
        +
      • Init 初始化
      • +
      • Appear 展示
      • +
      • WillDisappear 即将消失
      • +
      • Disappear 页面消失
      • +
      • Destroy 页面销毁
      • +
      • Background 置后台
      • +
      • Foreground 置前台
      • +
      +

      这些概念虽然不难理解,但是甚至比原生还冗杂😂。

      +

      整个Navigator容器,涉及Widget,State和Observer,在boost中继承关系如下:

      +

      container

      +
        +
      • BoostContainer 继承 Navigator
      • +
      • BoostContainerState 继承 NavigatorState 重载了push,pop,maybePop等函数,提供了一个返回键函数
      • +
      • ContainerNavigatorObserver 继承 NavigatorObserver ,新增了观察者的注册接口
      • +
      +

      栈操作

      +

      在自定义的页面容器中,主要重载的是路由的相关出栈、入栈操作。

      +

      pop拦截后,如果当前存在原生的Navigator视图栈,则优先弹出,如果不存在,则通过channel转发给了native;

      +
      /// boost_container.dart
      +@override
      +bool pop<T extends Object>([T result]) {
      +  // ...
      +  if (canPop()) {
      +    return super.pop(result);
      +  } else {
      +    if (T is Map<String, dynamic>) {
      +      FlutterBoost.singleton
      +        .close(uniqueId, result: result as Map<String, dynamic>);
      +    } else {
      +      FlutterBoost.singleton.close(uniqueId);
      +    }
      +  }
      +  return false;
      +}
      +
      +

      对push的拦截和pop不同,push拦截只增加了对route的pre和post修饰,最终还是通过调用super,交给了原生的Navigator处理。

      +
      /// boost_container.dart
      +@override
      +Future<T> push<T extends Object>(Route<T> route) {
      +  Route<T> newRoute;
      +  /// ...
      +  Future<T> future = super.push<T>(newRoute ?? route);
      +  routerHistory.add(route);
      +  /// ...
      +  return future;
      +}
      +
      +

      总的来说就是出栈需要考虑Navigator自身已经由Native控制的Overlay这一次页面容器,入栈则是使用原生Navigator逻辑。

      +

      页面Widget绑定

      +

      在Container中,我们没有看到build重载,上下文中,也不涉及页面构建逻辑。回顾下我们前面分析的嵌套关系图

      +

      boost-manager

      +
      +

      那么Boost是如何实现的页面绑定关系?

      +
      +

      在Flutter中,经常通过WidgetBuilder来实现视图的按需构建。这里Boost定义了一个页面配置的模型。

      +
      /// boost_container.dart
      +class BoostContainerSettings {
      +  final String uniqueId;
      +  final String name;
      +  final Map params;
      +  final WidgetBuilder builder;
      +
      +  const BoostContainerSettings(
      +      {this.uniqueId = 'default',
      +      this.name = 'default',
      +      this.params,
      +      this.builder});
      +}
      +
      +

      其中包含一个builder,最终会透传给Navigator的builder属性,从而实现了Widget的绑定。setting配置在有页面push的时候动态生成,由函数_createContainerSettings负责。

      +
      /// container_coordinator.dart
      +final BoostContainerSettings routeSettings = BoostContainerSettings(
      +  uniqueId: pageId,
      +  name: name,
      +  params: params,
      +  builder: (BuildContext ctx) {
      +        // ...
      +    //Build a page using default builder.
      +    if (page == null && _defaultPageBuilder != null) {
      +      page = _defaultPageBuilder(name, params, pageId);
      +    }
      +        // ...
      +    return page;
      +  });
      +
      +

      其他

      +

      处理页面的出栈入栈相关逻辑,BoostContainer中还添加了一些对栈状态的监听,主要是添加监听器和循环遍历,这里不再展开,相关接口为ContainerNavigatorObserver

      +

      当Widget dipose时销毁观察者和历史路由页面

      +
      powered by Gitbook最近更新 +2020-03-23 +
      + +
      + +
      +
      +
      + +

      results matching ""

      +
        + +
        +
        + +

        No results matching ""

        + +
        +
        +
        + +
        +
        + +
        + + + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/books/boost/boost-how-to.html b/books/boost/boost-how-to.html new file mode 100644 index 0000000..da01ee1 --- /dev/null +++ b/books/boost/boost-how-to.html @@ -0,0 +1,684 @@ + + + + + + + Boost接入吹水 · Flutter Boost核心原理Dart篇 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        + + + + + + + + +
        + +
        + +
        + + + + + + + + +
        +
        + +
        +
        + +
        + +

        Boost接入吹水

        +

        开发Flutter的小伙伴应该都知道,目前社区内开源且比较成熟的混合框架非常少。

        +

        闲鱼作为国内较早研究,并大规模进行Flutter落地的团队,开源了他们自研的混合开发框架Flutter Boost。该项目自开源后,社区热度不断攀升,目前在Github上的❤已经达到3.5K。

        +
        +

        https://github.com/alibaba/flutter_boost

        +
        +

        这套方案有不少团队也采纳了,并且还基于这个方案做过对外分享,感兴趣的朋友可以度娘一下。

        +
        +

        PS:这个小专栏呢,我们不打算探讨到是选官方的Add to app,还是选Boost好,小孩子才做选择😅。

        +
        +

        在开始之前,我们做一下约定:

        +
          +
        • Boost的版本为 v0.1.61;

          +
        • +
        • 全文Boost均指代Flutter Boost,不做区分;

          +
        • +
        +

        如果您已经充分了解如何使用Boost,可以选择性的快速跳过本节。下面我们一步步先把Boost集成进来。

        +

        Yaml配置

        +

        Boost作为一款Flutter插件,它遵循官方的接入标准,首先在pubspec.yaml中添加对应依赖:

        +
        flutter_boost:
        +    git:
        +        url: 'https://github.com/alibaba/flutter_boost.git'
        +        ref: '0.1.61'
        +
        +

        针对androidx的兼容,需要依赖另一个分支。

        +
        flutter_boost:
        +    git:
        +        url: 'https://github.com/alibaba/flutter_boost.git'
        +        ref: 'feature/flutter_1.9_androidx_upgrade'
        +
        +

        除了通过git地址配置依赖,更常见的做法是通过pub发布,然后引用对应版本即可。关于更多的yaml依赖规则,可以参考这篇说明文档:

        +
        +

        https://dart.dev/tools/pub/dependencies

        +
        +

        接下来既可以开始使用Boost了,如果你查看项目介绍会发现,文档建设上面还是有提高空间的,在README.md中对接入的介绍只有一句话🙃:

        +
        ## boost集成
        +集成请看boost的Examples
        +

        Boost Dart配置

        +

        添加完依赖库后,可以进行相应的初始化配置。这里配置主要有两块,分别是如有初始化和入口配置。

        +
          +
        1. 路由配置
        2. +
        +
        FlutterBoost.singleton.registerPageBuilders({
        +  'first': (pageName, params, _) => FirstRouteWidget(),
        +  'second': (pageName, params, _) => SecondRouteWidget(),
        +  'tab': (pageName, params, _) => TabRouteWidget(),
        +  'platformView': (pageName, params, _) => PlatformRouteWidget(),
        +  'flutterFragment': (pageName, params, _) => FragmentRouteWidget(params),
        +  ///可以在native层通过 getContainerParams 来传递参数
        +  'flutterPage': (pageName, params, _) {
        +    print("flutterPage params:$params");
        +
        +    return FlutterRouteWidget(params:params);
        +  },
        +});
        +
        +
          +
        1. 入口配置
        2. +
        +
        MaterialApp(
        +  title: 'Flutter Boost example',
        +  builder: FlutterBoost.init(postPush: _onRoutePushed),
        +  home: Container(),
        +);
        +
        +

        Boost Native配置

        +

        正常来说,一个标准Flutter插件不应该要求Flutter开发者,过多的手工去修改Native配置,绝大部分的Flutter插件会通过自动生成的GeneratedPluginRegistrant完成插件注册逻辑。

        +

        但是这里针对Boost,是需要一些操作的,主要原因有两点:

        +
          +
        1. GeneratedPluginRegistrant的字段注册逻辑只是完成通道注册,这是插件与Native通信的核心;
        2. +
        3. Boost本身在Native侧也有比较强的定制逻辑,需要大量初始化逻辑,无法只通过GeneratedPluginRegistrant完成。
        4. +
        +

        Boost API

        +

        完成初始化配置后,可以按需同API进去页面的切换。页面管理的核心在于Native侧,Dart侧需要切换页面时通过静态通道发起事件:

        +
        FlutterBoost.singleton.open("second");
        +
        +
        /// flutter_boost.dart 
        +Future<Map<dynamic,dynamic>> open(String url,{Map<dynamic,dynamic> urlParams,Map<dynamic,dynamic> exts}){
        +  Map<dynamic, dynamic> properties = new Map<dynamic, dynamic>();
        +  properties["url"] = url;
        +  properties["urlParams"] = urlParams;
        +  properties["exts"] = exts;
        +  return channel.invokeMethod<Map<dynamic,dynamic>>(
        +    'openPage', properties);
        +}
        +
        +

        扩展

        +

        为什么Dart侧页面切换要通过native侧?

        +

        从其提供的能力来看,主要是为了从Native角度,封装出页面的生命周期事件。我们知道有状态的Widget本身只有initState和dispose事件,当页面更新时触发didUpdateWidget。

        +

        下面是以iOS为例,输出的页面状态变化日志:

        +
        +

        didInitPageContainer => willDisappearPageContainer => willShowPageContainer => didDisappearPageContainer => didShowPageContainer

        +
        +

        简答归纳就是切换时,新页面的出现和当前页面的消失状态,最后还dump除了最终视图栈情况。

        +
        [XDEBUG]---surface changed--reset-
        +flutter: FlutterBoost#onMetohdCall didInitPageContainer
        +flutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.Init
        +flutter: FlutterBoost#onMetohdCall willDisappearPageContainer
        +flutter: FlutterBoost#BoostContainerLifeCycleObserver container:tab lifeCycle:ContainerLifeCycle.WillDisappear
        +flutter: FlutterBoost#onMetohdCall willShowPageContainer
        +flutter: FlutterBoost#ContainerObserver#2 didPush
        +flutter: FlutterBoost#onMetohdCall didDisappearPageContainer
        +flutter: FlutterBoost#BoostContainerLifeCycleObserver container:tab lifeCycle:ContainerLifeCycle.Disappear
        +[DEBUG]--ADD--PageStack uid/name-->0/tab-->2/second
        +flutter: FlutterBoost#onMetohdCall didShowPageContainer
        +flutter: FlutterBoost#onShownContainerChanged old:null now:2
        +flutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.Appear
        +flutter: FlutterBoost#native containner did show,
        +manager dump:
        +onstage#:
        +  {uniqueId=2,name=second}
        +offstage#:
        +  {uniqueId=0,name=tab}
        +  {uniqueId=default,name=default}
        +flutter: FlutterBoost#ManagerNavigatorObserver didPush
        +flutter: FlutterBoost#build widget:SecondRouteWidget for page:second(2)
        +flutter: FlutterBoost#onShownContainerChanged old:0 now:2
        +

        类似的,当调用close,页面视图栈发生变化,也有对应状态切换。

        +
        flutter: FlutterBoost#onMetohdCall willDisappearPageContainer
        +flutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.WillDisappear
        +flutter: FlutterBoost#onMetohdCall willShowPageContainer
        +flutter: FlutterBoost#onMetohdCall didDisappearPageContainer
        +flutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.Disappear
        +[DEBUG]--ADD--PageStack uid/name-->0/tab-->2/second
        +flutter: FlutterBoost#onMetohdCall didShowPageContainer
        +flutter: FlutterBoost#ContainerObserver#2 didOnstage
        +flutter: FlutterBoost#BoostContainerLifeCycleObserver container:tab lifeCycle:ContainerLifeCycle.Appear
        +flutter: FlutterBoost#native containner did show,
        +manager dump:
        +onstage#:
        +  {uniqueId=0,name=tab}
        +offstage#:
        +  {uniqueId=2,name=second}
        +  {uniqueId=default,name=default}
        +[DEBUG]--REMOVE--PageStack uid/name-->0/tab
        +flutter: FlutterBoost#onShownContainerChanged old:2 now:0
        +flutter: FlutterBoost#onMetohdCall willDeallocPageContainer
        +flutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.Destroy
        +flutter: FlutterBoost#ContainerObserver#2 didRemove
        +flutter: FlutterBoost#native containner dealloc, 
        + manager dump:
        +onstage#:
        +  {uniqueId=0,name=tab}
        +offstage#:
        +  {uniqueId=default,name=default}
        +

        小结

        +

        这一节中,我们介绍了集成Boost的几个关键点:

        +
          +
        • yaml集成方式
        • +
        • Dart初始化配置
        • +
        • Native初始化配置和原因
        • +
        • Dart侧页面切换操作
        • +
        +
        powered by Gitbook最近更新 +2020-03-20 +
        + +
        + +
        +
        +
        + +

        results matching ""

        +
          + +
          +
          + +

          No results matching ""

          + +
          +
          +
          + +
          +
          + +
          + + + + + + + + + + + + + + +
          + + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/books/boost/boost-router.html b/books/boost/boost-router.html new file mode 100644 index 0000000..30a9010 --- /dev/null +++ b/books/boost/boost-router.html @@ -0,0 +1,644 @@ + + + + + + + 页面路由的实现与差异 · Flutter Boost核心原理Dart篇 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          + + + + + + + + +
          + +
          + +
          + + + + + + + + +
          +
          + +
          +
          + +
          + +

          页面路由的实现与差异

          +

          在前面的页面分析过程中,多次提到了channel通道的使用。这块通道逻辑都在container_coordinator.dart中,coordinator有调度员的意思,这大概就是路由管理封装类命名的原因吧。

          +

          路由绑定

          +

          既然是容器调度,那么调度员第一步要做的是什么呢? +自然是先要有可以被灵活调度的容器。因此,Boost使用的第一步就是先进行路由的注册配置。当我们执行registerPageBuilders时,它的具体实现如下:

          +
          /// flutter_boost.dart
          +///Register a map builders
          +void registerPageBuilders(Map<String, PageBuilder> builders) {
          +  ContainerCoordinator.singleton.registerPageBuilders(builders);
          +}
          +
          +

          可以看到与原生route非常类似,我们仅仅是传入了一个键值对的Map。其中Key是页面路由的么名字,Value其实是一个Builder,类似于WidgetBuilder。差异在于Boost额外封装了一些容器维度的属性,比如说页面的唯一标识,参数等。所以PageBuilder可以简单理解为就是一个个性化的专用WidgetBuilder。

          +

          页面配置

          +

          有了路由表以后,比那可以在合适的时候调用,从路由表中获取目标页面的PageBuilder,然后构建出一个真正的Widget页面。这一步又是怎么实现的呢?

          +

          在《顶层容器栈的实现》一节中,我们通过检索路由表被调用的逻辑,知道当Dart侧收到页面创建事件willShowPageContainer时,回去实例化一个页面。实例化页面的时候,根据事件的参数,构造了一个页面维度的配置,叫做BoostContainerSettings,配置中的WidgetBuilder是用和原生路由配合工作的。

          +
          class BoostContainerSettings {
          +  final String uniqueId;
          +  final String name;
          +  final Map params;
          +  final WidgetBuilder builder;
          +
          +  const BoostContainerSettings(
          +      {this.uniqueId = 'default',
          +      this.name = 'default',
          +      this.params,
          +      this.builder});
          +}
          +
          +

          配置的生成逻辑如下,当WidgetBuilder被Flutter触发的时候,将构建Widget的任务委托给了PageBuilder处理:

          +
          /// conatiner_coordinator.dart
          +BoostContainerSettings _createContainerSettings(
          +  String name, Map params, String pageId) {
          +  Widget page;
          +
          +  final BoostContainerSettings routeSettings = BoostContainerSettings(
          +    uniqueId: pageId,
          +    name: name,
          +    params: params,
          +    builder: (BuildContext ctx) {
          +      //Try to build a page using keyed builder.
          +      if (_pageBuilders[name] != null) {
          +        page = _pageBuilders[name](name, params, pageId);
          +      }
          +
          +      //Build a page using default builder.
          +      if (page == null && _defaultPageBuilder != null) {
          +        page = _defaultPageBuilder(name, params, pageId);
          +      }
          +
          +      assert(page != null);
          +      Logger.log('build widget:$page for page:$name($pageId)');
          +
          +      return page;
          +    });
          +
          +  return routeSettings;
          +}
          +
          +
          +

          进一步的,我们继续分析下,这个WidgetBuilder什么时候会被Flutter触发呢?

          +
          +

          简单来说是在Navigator中触发的。我们已经知道BoostContainer本身继承了Navigator,所以它是被当做Navigator来使用的。在构建BoostContainer时,构造器如下:

          +
          factory BoostContainer.obtain(
          +        Navigator navigator, BoostContainerSettings settings) =>
          +    BoostContainer(
          +        key: GlobalKey<BoostContainerState>(),
          +        settings: settings,
          +        onGenerateRoute: (RouteSettings routeSettings) {
          +          if (routeSettings.name == '/') {
          +            return BoostPageRoute<dynamic>(
          +                pageName: settings.name,
          +                params: settings.params,
          +                uniqueId: settings.uniqueId,
          +                animated: false,
          +                settings: routeSettings,
          +                builder: settings.builder);
          +          } else {
          +            return navigator.onGenerateRoute(routeSettings);
          +          }
          +        },
          +        observers: <NavigatorObserver>[
          +          ContainerNavigatorObserver.bindContainerManager()
          +        ],
          +        onUnknownRoute: navigator.onUnknownRoute);
          +
          +

          通过onGenerateRoute,将Boost的个性化页面创建最终与Navigator关联了起来。

          +

          Boost事件定义

          +

          事件的定义目前内置了4种,分别是:

          +
            +
          • backPressedCallback 返回键事件
          • +
          • foreground 页面进入前台
          • +
          • background 页面进入后台
          • +
          • scheduleFrame 调度一次页面绘制
          • +
          +

          前后台事件触发后,会对当前状态进行标记,具体是通过Boost单例,获取的当前的目标Container容器;最后通知观察者。 +返回事件的处理则会分发至当前Container,触发一次页面的pop动作。

          +

          Boost方法定义

          +

          在使用Boost过程中,我们可以观测到很多标签日志输出,如果要查方法相关的日志,可以过滤关键词onMetohdCall。 +目前支持的核心方法包括:

          +
            +
          • didInitPageContainer
          • +
          • willShowPageContainer
          • +
          • didShowPageContainer
          • +
          • willDisappearPageContainer
          • +
          • didDisappearPageContainer
          • +
          • willDeallocPageContainer
          • +
          • onNativePageResult
          • +
          +

          几乎都是围绕着两个页面切换过程中的状态进行的定义。有一个需要注意就是针对页面show的两个事件处理:

          +
            +
          • willShowPageContainer
          • +
          • didShowPageContainer
          • +
          +

          willShow在源码中不会通知其自定义的生命周期回调,didShow会通知。除此之外,两者的实现中都有对页码创建。为什么会存在这种逻辑,目前单纯分析Dart侧代码得不到解释,后续在分析Native源码时可以进一步确认相关调用链路。

          +
          powered by Gitbook最近更新 +2020-03-24 +
          + +
          + +
          +
          +
          + +

          results matching ""

          +
            + +
            +
            + +

            No results matching ""

            + +
            +
            +
            + +
            +
            + +
            + + + + + + + + + + + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/books/boost/flutter-activity.md b/books/boost/flutter-activity.md new file mode 100644 index 0000000..874e662 --- /dev/null +++ b/books/boost/flutter-activity.md @@ -0,0 +1,30 @@ +# FlutterActivity载体分析 + +Boost在处理Flutter载体时,基于Flutter提供的载体做了二次开发,同时为了满足某些修改,对部分源码进行了整体拷贝+修改。这带来了一个问题,存在较大的版本兼容风险,同时对开发者来说,Boost改造后的载体其实很难与原生载体作区分。 + +这一节我们在分析改造后的Flutter载体时,将横向对照原载体,这样可以将Boost做的个性化的关键点提取出来。 + +## 载体启动分析 +* BoostFlutterActivity.java +* FlutterActivity.java + +新增: +* NewEngineIntentBuilder调整加入url配置 +* NewEngineIntentBuilder调整加入params配置 +* 载体加入getContainerUrl +*载体加入getContainerUrlParams + +修改: +* NewEngineIntentBuilder调整destroy_engine_with_activity默认值,由true改为false + +> Flutter目前还提供了具备复用能力的CachedEngineIntentBuilder,针对每个引擎对象,提供了对应的engineid + +删除: +* 取消页面销毁回调lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY); + +除了上述差异外,Activity载体还有很多差异,主要集中在FlutterActivity有很多API是Boost不具备的。两者差异已经比较大。这也印证了他的风险,通过整体拷贝做定制会导致碎片化和版本对齐的适配工作。 + +那么Boost是如何做的版本适配呢?我们以从1.9到1.12为例看一下提交记录: +![](assets/boost-version-compact.png) + +可以推断的是,Boost在这个版本放弃了全面对齐,仅仅做了最Error级别的API不兼容适配。 \ No newline at end of file diff --git a/books/boost/gitbook/fonts/fontawesome/FontAwesome.otf b/books/boost/gitbook/fonts/fontawesome/FontAwesome.otf new file mode 100644 index 0000000..d4de13e Binary files /dev/null and b/books/boost/gitbook/fonts/fontawesome/FontAwesome.otf differ diff --git a/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.eot b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.eot new file mode 100644 index 0000000..c7b00d2 Binary files /dev/null and b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.eot differ diff --git a/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.svg b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.svg new file mode 100644 index 0000000..8b66187 --- /dev/null +++ b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.ttf b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.ttf new file mode 100644 index 0000000..f221e50 Binary files /dev/null and b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.ttf differ diff --git a/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.woff b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.woff new file mode 100644 index 0000000..6e7483c Binary files /dev/null and b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.woff differ diff --git a/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 new file mode 100644 index 0000000..7eb74fd Binary files /dev/null and b/books/boost/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 differ diff --git a/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/config.js b/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/config.js new file mode 100644 index 0000000..33e541c --- /dev/null +++ b/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/config.js @@ -0,0 +1,72 @@ +require('./log'); + +const defaultConfig = { + // 标题是否显示层级序号 + showLevel: true, + // 页面内的序号是否与 summary.md 中官方默认主题生成的序号相关联 + associatedWithSummary: true, + printLog: false, // 是否打印日志,就如同自己使用了prism,但是很容易写错他的定义,比如css写成了csss,文章太多的话,生成出错,但是找不到是那篇文章,打开该选项就能定位了 + multipleH1: true, // 多H1模式么?一般正常的文章一个md文件只有一个H1标题,这个时候就适合关闭该选项,生成的标题不会多一个 1. 出来 + // 模式:分为三种:float:浮动导航、pageTop:页面内部顶部导航、null:不显示导航 + mode: "float", + float: { //浮动导航设置 + showLevelIcon: false, //是否显示层级图标 + level1Icon: "fa fa-hand-o-right", + level2Icon: "fa fa-hand-o-right", + level3Icon: "fa fa-hand-o-right" + }, + pageTop: { + showLevelIcon: false, //是否显示层级图标 + level1Icon: "fa fa-hand-o-right", + level2Icon: "fa fa-hand-o-right", + level3Icon: "fa fa-hand-o-right" + }, + // 官方默认主题 层级开关 + themeDefault: { + showLevel: false + } +} + +/** + * 处理默认参数 + * @param defaultConfig + * @param config + */ +function handler(defaultConfig, config) { + if (config) { + for (var item in defaultConfig) { + if (item in config) { + defaultConfig[item] = config[item]; + } + } + } +} +/** + * 处理所有的配置参数 + * @param bookIns + */ +function handlerAll(bookIns) { + var config = bookIns.config.get('pluginsConfig')['anchor-navigation-ex-toc']; + var themeDefaultConfig = bookIns.config.get('pluginsConfig')['theme-default']; + handler(defaultConfig, config); + handler(defaultConfig.themeDefault, themeDefaultConfig); + + if (config.isRewritePageTitle) { + console.error("error:".error + + "plugins[anchor-navigation-ex-toc]:isRewritePageTitle 配置只支持0.3.x 版本," + + "请到https://github.com/zq99299/gitbook-plugin-anchor-navigation-ex查看最新版本的配置项"); + console.log(""); + console.error("error:".error + + "plugins[anchor-navigation-ex-toc]:isRewritePageTitle Configuration only supports 0.3.x version," + + "Please check here https://github.com/zq99299/gitbook-plugin-anchor-navigation-ex for the latest version of the configuration item"); + } +} +/** + * 本类中 config 单例共享 + * @type {{config: {showLevel: boolean, associatedWithSummary: boolean, mode: string, float: {showLevelIcon: boolean, level1Icon: string, level2Icon: string, level3Icon: string}, top: {showLevelIcon: boolean, level1Icon: string, level2Icon: string, level3Icon: string}, themeDefault: {showLevel: boolean}}, handler: handler, handlerAll: handlerAll}} + */ +module.exports = { + config: defaultConfig, + handler: handler, + handlerAll: handlerAll +} diff --git a/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/log.js b/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/log.js new file mode 100644 index 0000000..4af71d3 --- /dev/null +++ b/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/log.js @@ -0,0 +1,16 @@ +var colors = require('colors'); +colors.setTheme({ + silly: 'rainbow', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red' +}); + +module.exports = colors; + diff --git a/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/plugin.js b/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/plugin.js new file mode 100644 index 0000000..a94a985 --- /dev/null +++ b/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/lib/plugin.js @@ -0,0 +1,311 @@ +var cheerio = require('cheerio'); +var slug = require('github-slugid'); +var Config = require('./config.js'); + + +/** + * 处理toc相关,同时处理标题和id + * @param $ + * @param option + * @param page + * @returns {Array} 返回处理好的tocs合集 + */ +function handlerTocs($, page) { + var config = Config.config; + var tocs = []; + var count = { + h1: 0, + h2: 0, + h3: 0 + }; + var titleCountMap = {}; // 用来记录标题出现的次数 + var h1 = 0, h2 = 0, h3 = 0; + $(':header').each(function (i, elem) { + var header = $(elem); + var id = addId(header, titleCountMap); + + if (id) { + switch (elem.tagName) { + case "h1": + handlerH1Toc(config, count, header, tocs, page.level); + break; + case "h2": + handlerH2Toc(config, count, header, tocs, page.level); + break; + case "h3": + handlerH3Toc(config, count, header, tocs, page.level); + break; + default: + titleAddAnchor(header, id); + break; + } + } + }); + // 不然标题重写就没有效果,如果在外面不调用这句话的话 + page.content = $.html(); + return tocs; +} + +/** + * 处理锚点 + * @param header + * @param titleCountMap 用来记录标题出现的次数 + * @returns {string} + */ +function addId(header, titleCountMap) { + var id = header.attr('id') || slug(header.text()); + var titleCount = titleCountMap[id] || 0; + titleCountMap[id] = titleCount + 1; + // console.log('id:', id, 'n:', titleCount, 'hashmap:', titleCountMap) + if (titleCount) {//此标题已经存在 null/undefined/0/NaN/ 表达式时,统统被解释为false + id = id + '_' + titleCount; + } + header.attr("id", id); + return id; +} + +/** + * 标题增加锚点效果 + * @param header + * @param id + */ +function titleAddAnchor(header, id) { + header.prepend('' + + '' + + ''); +} + +/** + * 处理h1 + * @param count 计数器 + * @param header + * @param tocs 根节点 + */ +function handlerH1Toc(config, count, header, tocs, pageLevel) { + var title = header.text(); + var id = header.attr('id'); + var level = ''; //层级 + + if (config.showLevel) { + //层级显示仅在需要的时候处理 + count.h1 += 1; + count.h2 = 0; + count.h3 = 0; + if(config.multipleH1){ + level = count.h1 + '. '; + }else{ + level = ' '; + } + // 是否与官网默认主题层级序号相关联 + if (config.associatedWithSummary && config.themeDefault.showLevel) { + level = pageLevel + '.' + level; + } + header.text(level + title); //重写标题 + } + titleAddAnchor(header, id); + tocs.push({ + name: title, + level: level, + url: id, + children: [] + }); +} +/** + * 处理h2 + * @param count 计数器 + * @param header + */ +function handlerH2Toc(config, count, header, tocs, pageLevel) { + var title = header.text(); + var id = header.attr('id'); + var level = ''; //层级 + + if (tocs.length <= 0) { + titleAddAnchor(header, id); + return; + } + + var h1Index = tocs.length - 1; + var h1Toc = tocs[h1Index]; + if (config.showLevel) { + count.h2 += 1; + count.h3 = 0; + if(config.multipleH1){ + level = (count.h1 + '.' + count.h2 + '. '); + }else{ + level = (count.h2 + '. '); + } + if (config.associatedWithSummary && config.themeDefault.showLevel) { + level = pageLevel + '.' + level; + } + header.text(level + title); //重写标题 + } + titleAddAnchor(header, id); + h1Toc.children.push({ + name: title, + level: level, + url: id, + children: [] + }); +} +/** + * 处理h3 + * @param count 计数器 + * @param header + */ +function handlerH3Toc(config, count, header, tocs, pageLevel) { + var title = header.text(); + var id = header.attr('id'); + var level = ''; //层级 + + if (tocs.length <= 0) { + titleAddAnchor(header, id); + return; + } + var h1Index = tocs.length - 1; + var h1Toc = tocs[h1Index]; + var h2Tocs = h1Toc.children; + if (h2Tocs.length <= 0) { + titleAddAnchor(header, id); + return; + } + var h2Toc = h1Toc.children[h2Tocs.length - 1]; + + if (config.showLevel) { + count.h3 += 1; + if(config.multipleH1){ + level = (count.h1 + '.' + count.h2 + '.' + count.h3 + '. '); + }else{ + level = (count.h2 + '.' + count.h3 + '. '); + } + if (config.associatedWithSummary && config.themeDefault.showLevel) { + level = pageLevel + "." + level; + } + header.text(level + title); //重写标题 + } + titleAddAnchor(header, id); + h2Toc.children.push({ + name: title, + level: level, + url: id, + children: [] + }); +} + +/** + * 处理浮动导航:拼接锚点导航html,并添加到html末尾,利用css 悬浮 + * @param option + * @param tocs + * @param page + */ +function handlerFloatNavbar($, tocs, page) { + var config = Config.config; + var float = config.float; + var level1Icon = ''; + var level2Icon = ''; + var level3Icon = ''; + if (float.showLevelIcon) { + level1Icon = float.level1Icon; + level2Icon = float.level2Icon; + level3Icon = float.level3Icon; + } + + var html = "
            "; + + page.content = html + $.html(); +} + +function handlerPageTopNavbar($, tocs, page) { + var html = buildTopNavbar($, tocs, page); + html += ""; + page.content = html + $.html(); +} + +function buildTopNavbar($, tocs, page) { + var config = Config.config; + var pageTop = config.pageTop; + var level1Icon = ''; + var level2Icon = ''; + var level3Icon = ''; + if (pageTop.showLevelIcon) { + level1Icon = pageTop.level1Icon; + level2Icon = pageTop.level2Icon; + level3Icon = pageTop.level3Icon; + } + + var html = "
            "; + + return html; +} + +function start(bookIns, page) { + var $ = cheerio.load(page.content); + // 处理toc相关,同时处理标题和id + var tocs = handlerTocs($, page); + + // 设置处理之后的内容 + if (tocs.length == 0) { + page.content = $.html(); + return; + } + if(!//.test(page.content)){ + var config = Config.config; + var mode = config.mode; + if (mode == 'float') { + handlerFloatNavbar($, tocs, page); + } else if (mode == 'pageTop') { + handlerPageTopNavbar($, tocs, page); + } + } + + var $x = cheerio.load(page.content); + $x('extoc').replaceWith($x(buildTopNavbar($, tocs, page))); + page.content = $x.html(); +} + +module.exports = start; diff --git a/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/style/plugin.css b/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/style/plugin.css new file mode 100644 index 0000000..ed6c7ed --- /dev/null +++ b/books/boost/gitbook/gitbook-plugin-anchor-navigation-ex-toc/style/plugin.css @@ -0,0 +1,206 @@ +/** 浮动导航 */ +#anchor-navigation-ex-navbar { + background-color: #fafafa; + border: 1px solid rgba(0, 0, 0, .07); + border-radius: 1px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + background-clip: padding-box; + padding: 5px 10px; + position: fixed; + /*background-color: rgba(255,255,255,0.98);*/ + right: 50px; + top: 68px; + font-size: 12px; + white-space: nowrap; + z-index: 999; + cursor: pointer; + text-align: right; + max-height: 70%; + overflow-y: auto; + overflow-x: hidden; +} + +#anchor-navigation-ex-navbar ul { + display: none; + text-align: left; + padding-right: 10px; + padding-left: 10px; + list-style-type: none; +} + +#anchor-navigation-ex-navbar:hover ul { + display: block; +} + +#anchor-navigation-ex-navbar ul li a { + text-decoration: none; + border-bottom: none; + font-size: 14px; + color: #364149; + background: 0 0; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + position: relative; +} + +#anchor-navigation-ex-navbar ul li a:hover { + text-decoration: underline; +} + +#anchor-navigation-ex-navbar ul li .title-icon { + padding-right: 4px; +} + +/*对应官网皮肤主题颜色*/ +.book.color-theme-1 #anchor-navigation-ex-navbar { + background-color: #111111; + border-color: #7e888b; + color: #afa790; +} + +.book.color-theme-1 #anchor-navigation-ex-navbar ul li a { + color: #877f6a; +} + +.book.color-theme-2 #anchor-navigation-ex-navbar { + background-color: #2d3143; + border-color: #272a3a; + color: #bcc1d2; +} + +.book.color-theme-2 #anchor-navigation-ex-navbar ul li a { + color: #c1c6d7; +} + +/* 返回顶部 */ +#anchorNavigationExGoTop { + position: fixed; + right: 50px; + bottom: 68px; + background-color: #fafafa; + border: 1px solid rgba(0, 0, 0, .07); + border-radius: 1px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + background-clip: padding-box; + z-index: 999; + cursor: pointer; + font-size: 12px; + padding: 5px 10px; + color: #364149; +} +/*对应官网皮肤主题颜色*/ +.book.color-theme-1 #anchorNavigationExGoTop { + background-color: #111111; + border-color: #7e888b; + color: #afa790; +} + +.book.color-theme-2 #anchorNavigationExGoTop { + background-color: #2d3143; + border-color: #272a3a; + color: #bcc1d2; +} + +a.anchor-navigation-ex-anchor { + color: inherit !important; + display: none; + margin-left: -30px; + padding-left: 40px; + cursor: pointer; + position: absolute; + top: 0; + left: 0; + bottom: 0; +} + +a.anchor-navigation-ex-anchor i { + margin-left: -30px; + /*color: #000;*/ + vertical-align: middle; + font-size: 16px !important; +} + +h1, h2, h3, h4, h5, h6 { + position: relative; +} + +h1:hover a.anchor-navigation-ex-anchor, h2:hover a.anchor-navigation-ex-anchor, h3:hover a.anchor-navigation-ex-anchor, +h4:hover a.anchor-navigation-ex-anchor, h5:hover a.anchor-navigation-ex-anchor, h6:hover a.anchor-navigation-ex-anchor { + display: inline-block; +} + +.book .book-body .page-wrapper .page-inner section.normal { + overflow: visible; +} + +/* 页面内顶部固定导航 */ +#anchor-navigation-ex-pagetop-navbar{ + /* border: 1px solid rgba(0, 0, 0, .07); */ + /* border-radius: 1px; */ + /* background-clip: padding-box; */ + /* padding: 5px 10px; */ + /* background-color: #fafafa; */ + /* font-size: 12px; */ +} + +#anchor-navigation-ex-pagetop-navbar ul { + text-align: left; + padding-right: 10px; + /* padding-left: 10px; */ + /* list-style-type: none; */ +} + +#anchor-navigation-ex-pagetop-navbar:hover ul { + display: block; +} + +/* 去掉颜色 */ +#anchor-navigation-ex-pagetop-navbar ul li a { + text-decoration: none; + border-bottom: none; + /* font-size: 14px; */ + /* color: #364149; */ + background: 0 0; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + position: relative; +} + +#anchor-navigation-ex-pagetop-navbar ul li a:hover { + text-decoration: underline; +} + +#anchor-navigation-ex-pagetop-navbar ul li .title-icon { + padding-right: 4px; +} + +/*对应官网皮肤主题颜色*/ +.book.color-theme-1 #anchor-navigation-ex-pagetop-navbar { + background-color: #111111; + border-color: #7e888b; + color: #afa790; +} + +.book.color-theme-1 #anchor-navigation-ex-pagetop-navbar ul li a { + color: #877f6a; +} + +.book.color-theme-2 #anchor-navigation-ex-pagetop-navbar { + background-color: #2d3143; + border-color: #272a3a; + color: #bcc1d2; +} + +.book.color-theme-2 #anchor-navigation-ex-pagetop-navbar ul li a { + color: #c1c6d7; +} + + + + + + diff --git a/books/boost/gitbook/gitbook-plugin-code/plugin.css b/books/boost/gitbook/gitbook-plugin-code/plugin.css new file mode 100644 index 0000000..a68fcdc --- /dev/null +++ b/books/boost/gitbook/gitbook-plugin-code/plugin.css @@ -0,0 +1,37 @@ +#code-textarea { + height: 0; + position: fixed; + top: -1000px; + width: 0; +} + +.code-wrapper { + position: relative; +} + +.code-wrapper i { + color: #c1c7cd; + cursor: pointer; + font-size: 12px; + font-weight: bold; + position: absolute; + right: 1em; + top: 1em; +} + +.code-wrapper pre { + background: #f7f8f9; + border-radius: 3px; + counter-reset: line; + font-size: 15px; +} + +.code-wrapper pre > code > span.code-line:before { + counter-increment: line; + color: #c1c7cd; + content: counter(line); + display: inline-block; + font-size: 12px; + margin-right: 1.5em; + width: 1em; +} diff --git a/books/boost/gitbook/gitbook-plugin-code/plugin.js b/books/boost/gitbook/gitbook-plugin-code/plugin.js new file mode 100644 index 0000000..555d724 --- /dev/null +++ b/books/boost/gitbook/gitbook-plugin-code/plugin.js @@ -0,0 +1,91 @@ +require(['gitbook', 'jQuery'], function(gitbook, $) { + + const TERMINAL_HOOK = '**[terminal]' + + var pluginConfig = {}; + var timeouts = {}; + + function addCopyButton(wrapper) { + wrapper.append( + $('') + .click(function() { + copyCommand($(this)); + }) + ); + } + + function addCopyTextarea() { + + /* Add also the text area that will allow to copy */ + $('body').append('",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/books/boost/method-channel.html b/books/boost/method-channel.html new file mode 100644 index 0000000..767e8eb --- /dev/null +++ b/books/boost/method-channel.html @@ -0,0 +1,569 @@ + + + + + + + Boost全双工通道 · Flutter Boost核心原理Dart篇 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            +
            + + + + + + + + +
            + +
            + +
            + + + + + + + + +
            +
            + +
            +
            + +
            + +

            Boost全双工通道

            +

            在Flutter与Native通信过程中,框架本身提供了一套Channel机制,方便开发者进行数据的双向读写。

            +

            这一节的标题"偷用"了数据通信中的"双工"概念,来表示Flutter通信的能力。通过在Native和Dart侧定义Channel通道,开发者可以非常简单就实现框架级别的数据交互。这比WebView和Native直接的通信好用很多,性能也更优,并且不会触发字符串长度问题导致的通信内容截断,有点扯远了。

            +

            在Flutter中,根据不同的使用场景Channel可以进一步细分,目前提供的有:

            +
              +
            • BasicMessageChannel 基础消息通道
            • +
            • MethodChannel 方法通道
            • +
            • OptionalMethodChannel 继承自MethodChannel
            • +
            • EventChannel 流式通道
            • +
            +

            如果读者对Channel的使用不慎了解,可以参考通道的使用文档,写的比较清楚:

            +
            +

            https://flutter.dev/docs/development/platform-integration/platform-channels

            +
            +

            Boost通信通道

            +

            在Boost里面通信的场景主要是定义双方的页面栈操作和相关联的事件消息,它使用的是MethodChannel

            +
            /// boost_channel.dart
            +final MethodChannel _methodChannel = MethodChannel("flutter_boost");
            +
            +

            由于通道本身是有开销的,在整个Boost中只有这一个通道,他作为全局单例被共享。我们前文汇总分析到的页面的事件传递,和页面入栈操作这些都是通过这一个通道来完成的。

            +

            在源码中,定义了一个BoostChannel的操作类,内部封装了MethodChannel的使用。它定义了两大类操作,收消息和发消息。

            +

            下面我们通过一张图,来概括BoostChannel所做的事情: +

            +

            针对消息类的,无论是收还是发,都约定了一个固定的字符串作为事件名__event__。对Native侧发来的消息的识别和监听,事件的名字固定为__event__。其他类型的事件全部进行转发,当做普通方法,有外部进行注册监听。

            +

            发消息包括事件的消息两类,分别是sendEvent和invokeXXXMetohd。

            +
            /// boost_channel.dart
            +_methodChannel.setMethodCallHandler((MethodCall call){
            +  if (call.method == "__event__") {
            +    String name = call.arguments["name"];
            +    Map arg = call.arguments["arguments"];
            +    List<EventListener> list = _eventListeners[name];
            +    if (list != null) {
            +      for (EventListener l in list) {
            +        l(name, arg);
            +      }
            +    }
            +  }else{
            +    for(MethodHandler handler in _methodHandlers) {
            +      handler(call);
            +    }
            +  }
            +
            +  return Future.value();
            +});
            +
            +
            powered by Gitbook最近更新 +2020-03-24 +
            + +
            + +
            +
            +
            + +

            results matching ""

            +
              + +
              +
              + +

              No results matching ""

              + +
              +
              +
              + +
              +
              + +
              + + + + + + + + + + +
              + + +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/books/boost/search_index.json b/books/boost/search_index.json new file mode 100644 index 0000000..a3e9fd6 --- /dev/null +++ b/books/boost/search_index.json @@ -0,0 +1 @@ +{"index":{"version":"0.5.12","fields":[{"name":"title","boost":10},{"name":"keywords","boost":15},{"name":"body","boost":1}],"ref":"url","documentStore":{"store":{"./":["03","2020","24","boost本身作为一个flutter插件,他的核心逻辑分为三部分,分别是dart侧的使用api和andorid、ios端上的容器支持。鉴于boost的混合思想,其重度依赖自定义的混合栈调用来实现页面的切换。","boost核心原理","boost核心原理》阅读之旅吧。","boost核心原理关于作者flutt","boost的实现原理和核心点,希望对flutter开发者更好地掌握混合开发有所增益。","flutter","gitbook最近更新","power","从事android开发多年的码农一枚,就职于58同城,负责58app的相关研发工作。","从源码解读flutter","关于作者","本系列文章谢绝转载,内容为私有原创,如有转载需求请联系作者chaobinwu89@gmail.com,并保留出处。","简介","那么究竟boost是如何实现的页面栈的管理?与原生视图的栈的关系又是怎么样的呢?带着这些疑问,开始你的《flutt"],"boost-how-to.html":["##","'0.1.61'","'feature/flutter_1.9_androidx_upgrade'","'first':","'flutter","'flutterfragment':","'flutterpage':","'https://github.com/alibaba/flutter_boost.git'","'openpage',","'platformview':","'second':","'tab':","(pagename,",");","///","///可以在native层通过","03","20","2020","=","=>",">0/tab",">2/second","[debug]","[xdebug]","_)","_onroutepushed),","add","api","api扩展小结boost接入吹水","app,还是选boost好,小孩子才做选择😅。","boost","boost。该项目自开源后,社区热度不断攀升,目前在github上的❤已经达到3.5k。","boost作为一款flutter插件,它遵循官方的接入标准,首先在pubspec.yaml中添加对应依赖:","boost接入吹水","boost接入吹水yaml配置boost","boost本身在native侧也有比较强的定制逻辑,需要大量初始化逻辑,无法只通过generatedpluginregistrant完成。","boost的版本为","boost集成","boost,不做区分;","builder:","chang","channel.invokemethod>(","container(),","container:second","container:tab","containn","dart侧页面切换操作","dart初始化配置","dart配置","dart配置boost","dealloc,","diddisappearpagecontain","didinitpagecontain","didonstag","didpush","didremov","didshowpagecontain","dump:","example',","exts;","exts}){","firstroutewidget(),","flutter:","flutter_boost.dart","flutter_boost:","flutterboost#boostcontainerlifecycleobserv","flutterboost#build","flutterboost#containerobserver#2","flutterboost#managernavigatorobserv","flutterboost#n","flutterboost#onmetohdcal","flutterboost#onshowncontainerchang","flutterboost.init(postpush:","flutterboost.singleton.open(\"second\");","flutterboost.singleton.registerpagebuilders({","flutterroutewidget(params:params);","fragmentroutewidget(params),","future>","generatedpluginregistrant的字段注册逻辑只是完成通道注册,这是插件与native通信的核心;","getcontainerparam","git:","gitbook最近更新","home:","https://dart.dev/tools/pub/depend","https://github.com/alibaba/flutter_boost","lifecycle:containerlifecycle.appear","lifecycle:containerlifecycle.destroy","lifecycle:containerlifecycle.disappear","lifecycle:containerlifecycle.init","lifecycle:containerlifecycle.willdisappear","manag","map","map();","materialapp(","native初始化配置和原因","native配置","native配置boost","new","now:0","now:2","offstage#:","old:0","old:2","old:nul","onstage#:","open(str","page:second(2)","pagestack","params,","params:$params\");","platformroutewidget(),","power","print(\"flutterpag","properti","properties);","properties[\"exts\"]","properties[\"url\"]","properties[\"urlparams\"]","ps:这个小专栏呢,我们不打算探讨到是选官方的add","ref:","remov","reset","return","secondroutewidget(),","show,","surfac","tabroutewidget(),","title:","uid/nam","url,{map","url:","url;","urlparams,map","urlparams;","v0.1.61;","widget:secondroutewidget","willdeallocpagecontain","willdisappearpagecontain","willshowpagecontain","yaml配置","yaml集成方式","{","{uniqueid=0,name=tab}","{uniqueid=2,name=second}","{uniqueid=default,name=default}","}","});","},","下面是以ios为例,输出的页面状态变化日志:","为什么dart侧页面切换要通过native侧?","从其提供的能力来看,主要是为了从native角度,封装出页面的生命周期事件。我们知道有状态的widget本身只有initstate和dispose事件,当页面更新时触发didupdatewidget。","但是这里针对boost,是需要一些操作的,主要原因有两点:","入口配置","全文boost均指代flutt","在开始之前,我们做一下约定:","如果您已经充分了解如何使用boost,可以选择性的快速跳过本节。下面我们一步步先把boost集成进来。","完成初始化配置后,可以按需同api进去页面的切换。页面管理的核心在于native侧,dart侧需要切换页面时通过静态通道发起事件:","小结","开发flutter的小伙伴应该都知道,目前社区内开源且比较成熟的混合框架非常少。","扩展","接下来既可以开始使用boost了,如果你查看项目介绍会发现,文档建设上面还是有提高空间的,在readme.md中对接入的介绍只有一句话🙃:","来传递参数","正常来说,一个标准flutter插件不应该要求flutter开发者,过多的手工去修改native配置,绝大部分的flutter插件会通过自动生成的generatedpluginregistrant完成插件注册逻辑。","添加完依赖库后,可以进行相应的初始化配置。这里配置主要有两块,分别是如有初始化和入口配置。","简答归纳就是切换时,新页面的出现和当前页面的消失状态,最后还dump除了最终视图栈情况。","类似的,当调用close,页面视图栈发生变化,也有对应状态切换。","路由配置","这一节中,我们介绍了集成boost的几个关键点:","这套方案有不少团队也采纳了,并且还基于这个方案做过对外分享,感兴趣的朋友可以度娘一下。","针对androidx的兼容,需要依赖另一个分支。","闲鱼作为国内较早研究,并大规模进行flutter落地的团队,开源了他们自研的混合开发框架flutt","除了通过git地址配置依赖,更常见的做法是通过pub发布,然后引用对应版本即可。关于更多的yaml依赖规则,可以参考这篇说明文档:","集成请看boost的exampl"],"boost-architecture.html":["03","2020","23","boost整体架构分析","boost整体架构分析flutt","boost架构","boost架构理解boost的新概念小结boost整体架构分析","contain","container就是一个普通的widget,直接继承了原生navigator,用于承载页面widget。可以认为他是用了替换原生的navigator的。","dart侧的多视图栈管理","flutter","gitbook最近更新","manager是flutter容器的管理,提供show,remove等api。它本身也是一个widget,通过对外暴露state,提供了api操作。这个widget内部管理了一个overlay组件,从而实现了多视图栈的管理。","native层的引擎复用处理","power","view,route,channel等,并不是boost独有的。对boost的源码分析将在后续章节逐一介绍。","下面我再结合boost里面的一些新名词,理解他们的实际含义和作用。","为了让boost更接地气,我决定把我对源码的理解,重新画一张low图,让boost落到地上,避免开发者被整张架构图给\"劝退\"了。(这里不是吐槽原图,也不代表原图表达有何不当之处)","其实就是对methochannel的使用,基本可以认为是一个东西的两种表述。","参考","名词多!","名词很多啊!!!","名词很多!!","后来看到作者又说了句:","在我们画的那张图中,隐去了关于路由的几个元素和箭头,同时我们把新的名词换为了原生名词。","在整个boost里面他的核心有两个:","坦白说,第一次看到这张图的时候,有几个感觉:","小结","已开源|码上用它开始flutter混合开发——flutterboost","当我们把boost架构简化后,可以把目光放到重点上面,其他的枝叶如flutt","我们想做到把flutter容器做成浏览器的感觉。填写一个页面地址,然后由容器去管理页面的绘制。","既然是flutter开发框架,我们首先要知道的就是通过boost进行业务开发时,他的整体技术架构是怎么样的。除了闲鱼团队的宣讲文章,我们还需深入到代码内部去了解一些新的概念.","现在我们通过几个问答来阐述boost的中核心内容:","理解boost的新概念","瞬间感觉boost高度被原地干拔起来了,这是要和v8引擎比肩么😶。","问题1:containermanager是工具类还是什么,他的具体代表了什么?","问题2:container和statefullwidget,statelesswidget的区别是什么?","问题3:messaging和coordinator本质是什么?","首先我们一起看一下整个boost的架构关系。"],"boost-container-manager.html":["!=","\"willshowpagecontainer\":","${call.method}\");","(boostcontainerobserv","(e)","(flutterboost.containermanager?.containscontainer(pageid)","(platform.isios)","(schedul","(schedulerbinding.instance.schedulerphas",");",".observersof())",".singleton.observershold","///","//return","//todo,","03","2020","23","=","==","=>","?.pushcontainer(_createcontainersettings(name,","@overrid","[],","[schedulerbinding.handledrawframe].","[widgetsbinding.addpersistentframecallback])","[widgetsbinding.drawframe]","_nativecontainerwillshow(pagename,","_nativecontainerwillshow(str","_offstage.add(_onstage);","_onmethodcall(methodcal","_onstag","_onstage.settings);","_onstage.settings.uniqueid);","_overlaykey,","_refreshoverlayentries();","assert(_offstage.every((boostcontain","assert(false,","assert(settings.uniqueid","bool","boostcontain","boostcontainer.obtain(widget.initnavigator,","boostcontainermanag","boostcontainermanager视图栈的实现页面入栈实现页面栈刷新逻辑顶层容器栈的实现","boost视图栈","break;","build(buildcontext","build/layout/paint","call)","call.arguments[\"pagename\"];","call.arguments[\"params\"];","call.arguments[\"uniqueid\"];","callback","case","catch","const","container)","container.settings.uniqueid","container_cordinator.dart","containerobserver#2","context)","current","didpush","didpush');","duration)","e.tostring());","executing.","final","flutterboost","flutterboost.containermanag","fn();","fn)","futur","gitbook最近更新","initialentries:","key:","logger.log(\"onmetohdcal","logger.log('containerobserver#2","map","name,","observ","observer(containeroperation.push,","onstag","overlay","overlay(","owner","owner?.rootsemanticsnode;","pageid)","pageid));","pagenam","param","params,","persist","persistentcallbacks,","pipeline.","pop","power","push","pushcontainer(boostcontainerset","remov","return","root","root?.attach(owner);","root?.detach();","schedulerbinding.instance.addpostframecallback((dur","schedulerphase.persistentcallbacks)","see","semanticsnod","semanticsown","setstate(()","setstate(voidcallback","settings)","settings);","settings.uniqueid));","string","super.setstate(fn);","tri","true","true)","true;","typically,","uniqueid","uniqueid);","void","widget","widgetsbinding.instance.pipelineowner?.semanticsowner;","{","{});","}","});","以example中的页面为例,当我们点击打开第二个flutter页面后,widget节点中插入了一个secondroutewidget。","入栈","再次通过channel将页面展示实践回传给native,事件名为onshowncontainerchanged;","出栈","到这里,不知道你有没有疑问,反正我是有的。","只有当整个条件满足时才会触发入栈操作,整个条件会屏蔽两种尝试入栈的情况:","可以看到他定义了针对页面的四种操作:","可以预见的时,我们调用的open操作最终也会通过channel再次从native侧回到dart侧,并修改数组元素。","同镇state数据变更,同时触发观察者回调函数的执行。","在修改overlay的过程中,主要分几步:","在执行入栈pushcontainer函数前有一个判断:flutterboost.containermanager?.containscontainer(pageid)","外层包裹的节点分别是:","如果当前flutter正在进程绘制调度,那么将刷新动作延迟加入下一次绘制的回调函数中。根据api注释,可以知道当persisntcallback代表build/layout/paint之一正在被执行","对应的dart侧实现位于函数:_nativecontainerwillshow。","将当前的页面加入offstage列表中,重新生成新的目标页面。","当前显示页面已经是需要入栈的页面,规避一个页面id多次调用入栈","当发出页面入栈出栈时,overlay节点所代表的的数组元素会增加。新增加的页面会插入到overlay数组的第一个,形式上就是stack的效果:先进后出。","当发生页面切换时,boost内部通过其自定义的顶层入口,将所有子页面都进行了一次包裹。","当这些完成后打印一行日志,标志着一次页面切换动作完成:","我们可以看到,会基于页面的pageid进行前置校验,通过后,则会调用manager对应state的pushcontainer函数,进行页面切换。","整个manager的页面构建非常简单,就是利用了overlay组件,实现了页面的层叠。这样每一层自身还可以使用原生的路由栈。","最后一个动作的作用有两个:","最后执行传入setstate的{}函数。所以说对overlay的操作就是在_refreshoverlayentries中进行的。这里还有一个注意点,重载的setstate屏蔽了super函数。","最后更新overlaystate并且添加下一帧刷新函数","构造新的boostconatiner数组,并且map转换为overlayentri","检索一下manager的上下文,答案很快就揭晓了:setstate函数被重载了。","正常来说修改稿state一定是在{}中改变的状态属性,并且该属性会被build直接、间接引用,才能达到刷新目的。","现在我们又新增了一个疑问:","现在我们继续回到manager上下文,分析对应的函数实现。","目标页面处于offstage队列中,如果要显示的页面已经在后台队列中,则忽略当次入栈","移除现有的overlay节点","移除(这个和pop的区别后面分析)","第二个刷新焦点,原因是这里每个overlayentry其实都有一个原生的navigator;","视图栈的实现","还记得前面我们打印的页面栈切换是的日志么,答案就在其中。我们搜索一下willshowpagecontainer这个定义好的方法名,可以找到蛛丝马迹:","这两个情况,第一个好理解,但是第二个初看起来是有瑕疵的:","这个函数做了三件事情:","这个疑问我们先放一放,后面再分析。","这个类的主要是作为入口,负责管理页面路由信息。","这里有两个细节指的注意,分别是两个断言处理:","那么这个channel对应的方法是什么?","问题1:加上目标页面已经存在于后台队列,那么如果要显示,是不是应该把他前面的页面全部出栈,然后将他显示出来?","问题2:入栈函数调用setstate({})触发了widget刷新,但是build函数内的依赖关系并没有被改变,如何刷新?","问题3:屏蔽了setstate的super之后,没有副作用吗?element如何进行待刷新标记?","需要验证android代码是否也可以移到这里","页面入栈实现","页面合法性校验,基于页面的唯一标识uniqueid,作用是防止重复入栈。可以结合containscontainer方法。","页面后台","页面栈刷新逻辑","顶层容器","顶层容器栈的实现","顶层容器栈的实现boost视图栈顶层容器"],"boost-container.html":["!=","&&","'default',","(buildcontext","(canpop())","(page","(t","...",".close(uniqueid,","//","///","//build","03","2020","23","=","==","??","@overrid","_defaultpagebuild","_defaultpagebuilder(name,","appear","background","bool","boost_container.dart","boostcontain","boostcontainerset","boostcontainersettings(","boostcontainerst","boostcontainer实现","builder.","builder:","builder;","class","const","container_coordinator.dart","containernavigatorobserv","ctx)","default","destroy","dipose时销毁观察者和历史路由页面","disappear","extend","false;","final","flutterboost.singleton","flutterboost.singleton.close(uniqueid);","foreground","futur","future;","gitbook最近更新","init","map","map)","map);","name,","name:","name;","navig","navigatorobserv","navigatorst","newroute;","null","null)","page","page;","pageid);","pageid,","params,","params:","params;","pop([t","pop拦截后,如果当前存在原生的navigator视图栈,则优先弹出,如果不存在,则通过channel转发给了native;","power","push(rout","result","result:","result])","return","rout","route)","route);","routerhistory.add(route);","routeset","string","super.pop(result);","super.push(newrout","this.builder});","this.nam","this.params,","uniqueid:","uniqueid;","us","widgetbuild","willdisappear","{","{this.uniqueid","}","});","其中包含一个builder,最终会透传给navigator的builder属性,从而实现了widget的绑定。setting配置在有页面push的时候动态生成,由函数_createcontainersettings负责。","其他","初始化","即将消失","在container中,我们没有看到build重载,上下文中,也不涉及页面构建逻辑。回顾下我们前面分析的嵌套关系图","在flutter中,经常通过widgetbuilder来实现视图的按需构建。这里boost定义了一个页面配置的模型。","在自定义的页面容器中,主要重载的是路由的相关出栈、入栈操作。","处理页面的出栈入栈相关逻辑,boostcontainer中还添加了一些对栈状态的监听,主要是添加监听器和循环遍历,这里不再展开,相关接口为containernavigatorobserver。","对push的拦截和pop不同,push拦截只增加了对route的pre和post修饰,最终还是通过调用super,交给了原生的navigator处理。","展示","当widget","总的来说就是出栈需要考虑navigator自身已经由native控制的overlay这一次页面容器,入栈则是使用原生navigator逻辑。","整个navigator容器,涉及widget,state和observer,在boost中继承关系如下:","栈操作","继承","置前台","置后台","这一节我们分析页面容器的实现。通过源码对比,可以知道boost参考了flutter内部的navigator实现,进行了相应的调整,更严格的说是继承了navigator。","这些概念虽然不难理解,但是甚至比原生还冗杂😂。","那么boost是如何实现的页面绑定关系?","重载了push,pop,maybepop等函数,提供了一个返回键函数","页面widget绑定","页面容器的实现类是boostcontainer。类似的,他也新增了一些状态的概念:","页面容器的视图管理","页面容器的视图管理boostcontainer实现栈操作页面widget绑定其他页面容器的视图管理","页面消失","页面销毁",",新增了观察者的注册接口"],"boost-router.html":["!=","&&","'/')","'default',","(_pagebuilders[name]","(buildcontext","(page","(routeset","(routesettings.nam","///","///regist","//build","//tri","03","2020","24","=","==","=>","[","],","_createcontainersettings(","_defaultpagebuild","_defaultpagebuilder(name,","_pagebuilders[name](name,","animated:","assert(pag","background","backpressedcallback","boostcontainer(","boostcontainer.obtain(","boostcontainerset","boostcontainersettings(","boostpageroute(","boost事件定义","boost方法定义","build","builder","builder.","builder:","builder;","builders)","class","conatiner_coordinator.dart","const","containercoordinator.singleton.registerpagebuilders(builders);","containernavigatorobserver.bindcontainermanager()","ctx)","default","diddisappearpagecontain","didinitpagecontain","didshowpagecontain","factori","false,","final","flutter_boost.dart","foreground","gitbook最近更新","globalkey(),","key","key:","logger.log('build","map","name,","name:","name;","navig","navigator,","navigator.ongenerateroute(routesettings);","navigator.onunknownroute);","null","null)","null);","observers:","ongenerateroute:","onnativepageresult","onunknownroute:","page","page:$name($pageid)');","page;","pageid)","pageid);","pageid,","pagename:","params,","params:","params;","power","registerpagebuilders(map","return","routeset","routesettings)","routesettings,","routesettings;","schedulefram","settings)","settings,","settings.builder);","settings.name,","settings.params,","settings.uniqueid,","settings:","string","this.builder});","this.nam","this.params,","uniqueid:","uniqueid;","us","void","widget","widget:$pag","widgetbuild","willdeallocpagecontain","willdisappearpagecontain","willshowpagecontain","willshow在源码中不会通知其自定义的生命周期回调,didshow会通知。除此之外,两者的实现中都有对页码创建。为什么会存在这种逻辑,目前单纯分析dart侧代码得不到解释,后续在分析native源码时可以进一步确认相关调用链路。","{","{this.uniqueid","}","});","},","事件的定义目前内置了4种,分别是:","几乎都是围绕着两个页面切换过程中的状态进行的定义。有一个需要注意就是针对页面show的两个事件处理:","前后台事件触发后,会对当前状态进行标记,具体是通过boost单例,获取的当前的目标container容器;最后通知观察者。","可以看到与原生route非常类似,我们仅仅是传入了一个键值对的map。其中key是页面路由的么名字,value其实是一个builder,类似于widgetbuilder。差异在于boost额外封装了一些容器维度的属性,比如说页面的唯一标识,参数等。所以pagebuilder可以简单理解为就是一个个性化的专用widgetbuilder。","在《顶层容器栈的实现》一节中,我们通过检索路由表被调用的逻辑,知道当dart侧收到页面创建事件willshowpagecontainer时,回去实例化一个页面。实例化页面的时候,根据事件的参数,构造了一个页面维度的配置,叫做boostcontainersettings,配置中的widgetbuilder是用和原生路由配合工作的。","在使用boost过程中,我们可以观测到很多标签日志输出,如果要查方法相关的日志,可以过滤关键词onmetohdcall。","在前面的页面分析过程中,多次提到了channel通道的使用。这块通道逻辑都在container_coordinator.dart中,coordinator有调度员的意思,这大概就是路由管理封装类命名的原因吧。","既然是容器调度,那么调度员第一步要做的是什么呢?","有了路由表以后,比那可以在合适的时候调用,从路由表中获取目标页面的pagebuilder,然后构建出一个真正的widget页面。这一步又是怎么实现的呢?","目前支持的核心方法包括:","简单来说是在navigator中触发的。我们已经知道boostcontainer本身继承了navigator,所以它是被当做navigator来使用的。在构建boostcontainer时,构造器如下:","自然是先要有可以被灵活调度的容器。因此,boost使用的第一步就是先进行路由的注册配置。当我们执行registerpagebuilders时,它的具体实现如下:","调度一次页面绘制","路由绑定","返回事件的处理则会分发至当前container,触发一次页面的pop动作。","返回键事件","进一步的,我们继续分析下,这个widgetbuilder什么时候会被flutter触发呢?","通过ongenerateroute,将boost的个性化页面创建最终与navigator关联了起来。","配置的生成逻辑如下,当widgetbuilder被flutter触发的时候,将构建widget的任务委托给了pagebuilder处理:","页面路由的实现与差异","页面路由的实现与差异路由绑定页面配置boost事件定义boost方法定义页面路由的实现与差异","页面进入前台","页面进入后台","页面配置"],"method-channel.html":["!=","\"__event__\")","(call.method","(eventlisten","(list","///","03","2020","24","=","==","_eventlisteners[name];","_methodchannel","_methodchannel.setmethodcallhandler((methodcal","_methodhandlers)","arg","arg);","basicmessagechannel","boost_channel.dart","boost全双工通道","boost全双工通道boost通信通道boost全双工通道","boost通信通道","call){","call.arguments[\"arguments\"];","call.arguments[\"name\"];","channel","eventchannel","final","for(methodhandl","future.value();","gitbook最近更新","handler","handler(call);","https://flutter.dev/docs/development/platform","integration/platform","l","l(name,","list","list)","map","methodchannel","methodchannel(\"flutter_boost\");","name","null)","optionalmethodchannel","power","return","string","{","}","});","}else{","下面我们通过一张图,来概括boostchannel所做的事情:","发消息包括事件的消息两类,分别是sendevent和invokexxxmetohd。","在boost里面通信的场景主要是定义双方的页面栈操作和相关联的事件消息,它使用的是methodchannel","在flutter与native通信过程中,框架本身提供了一套channel机制,方便开发者进行数据的双向读写。","在flutter中,根据不同的使用场景channel可以进一步细分,目前提供的有:","在源码中,定义了一个boostchannel的操作类,内部封装了methodchannel的使用。它定义了两大类操作,收消息和发消息。","基础消息通道","如果读者对channel的使用不慎了解,可以参考通道的使用文档,写的比较清楚:","方法通道","流式通道","由于通道本身是有开销的,在整个boost中只有这一个通道,他作为全局单例被共享。我们前文汇总分析到的页面的事件传递,和页面入栈操作这些都是通过这一个通道来完成的。","继承自methodchannel","这一节的标题\"偷用\"了数据通信中的\"双工\"概念,来表示flutter通信的能力。通过在native和dart侧定义channel通道,开发者可以非常简单就实现框架级别的数据交互。这比webview和native直接的通信好用很多,性能也更优,并且不会触发字符串长度问题导致的通信内容截断,有点扯远了。","针对消息类的,无论是收还是发,都约定了一个固定的字符串作为事件名__event__。对native侧发来的消息的识别和监听,事件的名字固定为__event__。其他类型的事件全部进行转发,当做普通方法,有外部进行注册监听。"]},"length":7},"tokenStore":{"root":{"0":{"3":{"docs":{"./":{"ref":"./","tf":0.0625},"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}},"docs":{}},"2":{"0":{"2":{"0":{"docs":{"./":{"ref":"./","tf":0.0625},"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}},"docs":{}},"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}},"3":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}},"4":{"docs":{"./":{"ref":"./","tf":0.0625},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}},"docs":{}},"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.013157894736842105}},"本":{"docs":{},"身":{"docs":{},"作":{"docs":{},"为":{"docs":{},"一":{"docs":{},"个":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"插":{"docs":{},"件":{"docs":{},",":{"docs":{},"他":{"docs":{},"的":{"docs":{},"核":{"docs":{},"心":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"分":{"docs":{},"为":{"docs":{},"三":{"docs":{},"部":{"docs":{},"分":{"docs":{},",":{"docs":{},"分":{"docs":{},"别":{"docs":{},"是":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},"的":{"docs":{},"使":{"docs":{},"用":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"和":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"o":{"docs":{},"r":{"docs":{},"i":{"docs":{},"d":{"docs":{},"、":{"docs":{},"i":{"docs":{},"o":{"docs":{},"s":{"docs":{},"端":{"docs":{},"上":{"docs":{},"的":{"docs":{},"容":{"docs":{},"器":{"docs":{},"支":{"docs":{},"持":{"docs":{},"。":{"docs":{},"鉴":{"docs":{},"于":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"混":{"docs":{},"合":{"docs":{},"思":{"docs":{},"想":{"docs":{},",":{"docs":{},"其":{"docs":{},"重":{"docs":{},"度":{"docs":{},"依":{"docs":{},"赖":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"的":{"docs":{},"混":{"docs":{},"合":{"docs":{},"栈":{"docs":{},"调":{"docs":{},"用":{"docs":{},"来":{"docs":{},"实":{"docs":{},"现":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"切":{"docs":{},"换":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"在":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"侧":{"docs":{},"也":{"docs":{},"有":{"docs":{},"比":{"docs":{},"较":{"docs":{},"强":{"docs":{},"的":{"docs":{},"定":{"docs":{},"制":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"大":{"docs":{},"量":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},",":{"docs":{},"无":{"docs":{},"法":{"docs":{},"只":{"docs":{},"通":{"docs":{},"过":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},"p":{"docs":{},"l":{"docs":{},"u":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"完":{"docs":{},"成":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"核":{"docs":{},"心":{"docs":{},"原":{"docs":{},"理":{"docs":{"./":{"ref":"./","tf":0.0625}},"》":{"docs":{},"阅":{"docs":{},"读":{"docs":{},"之":{"docs":{},"旅":{"docs":{},"吧":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}}}}},"关":{"docs":{},"于":{"docs":{},"作":{"docs":{},"者":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}}}}}}}}}}},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"原":{"docs":{},"理":{"docs":{},"和":{"docs":{},"核":{"docs":{},"心":{"docs":{},"点":{"docs":{},",":{"docs":{},"希":{"docs":{},"望":{"docs":{},"对":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"更":{"docs":{},"好":{"docs":{},"地":{"docs":{},"掌":{"docs":{},"握":{"docs":{},"混":{"docs":{},"合":{"docs":{},"开":{"docs":{},"发":{"docs":{},"有":{"docs":{},"所":{"docs":{},"增":{"docs":{},"益":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"版":{"docs":{},"本":{"docs":{},"为":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}},"。":{"docs":{},"该":{"docs":{},"项":{"docs":{},"目":{"docs":{},"自":{"docs":{},"开":{"docs":{},"源":{"docs":{},"后":{"docs":{},",":{"docs":{},"社":{"docs":{},"区":{"docs":{},"热":{"docs":{},"度":{"docs":{},"不":{"docs":{},"断":{"docs":{},"攀":{"docs":{},"升":{"docs":{},",":{"docs":{},"目":{"docs":{},"前":{"docs":{},"在":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},"上":{"docs":{},"的":{"docs":{},"❤":{"docs":{},"已":{"docs":{},"经":{"docs":{},"达":{"docs":{},"到":{"3":{"docs":{},".":{"5":{"docs":{},"k":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}},"docs":{}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"作":{"docs":{},"为":{"docs":{},"一":{"docs":{},"款":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"插":{"docs":{},"件":{"docs":{},",":{"docs":{},"它":{"docs":{},"遵":{"docs":{},"循":{"docs":{},"官":{"docs":{},"方":{"docs":{},"的":{"docs":{},"接":{"docs":{},"入":{"docs":{},"标":{"docs":{},"准":{"docs":{},",":{"docs":{},"首":{"docs":{},"先":{"docs":{},"在":{"docs":{},"p":{"docs":{},"u":{"docs":{},"b":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},".":{"docs":{},"y":{"docs":{},"a":{"docs":{},"m":{"docs":{},"l":{"docs":{},"中":{"docs":{},"添":{"docs":{},"加":{"docs":{},"对":{"docs":{},"应":{"docs":{},"依":{"docs":{},"赖":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"接":{"docs":{},"入":{"docs":{},"吹":{"docs":{},"水":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":10}},"y":{"docs":{},"a":{"docs":{},"m":{"docs":{},"l":{"docs":{},"配":{"docs":{},"置":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}},"集":{"docs":{},"成":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},",":{"docs":{},"不":{"docs":{},"做":{"docs":{},"区":{"docs":{},"分":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"整":{"docs":{},"体":{"docs":{},"架":{"docs":{},"构":{"docs":{},"分":{"docs":{},"析":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":10}},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}},"架":{"docs":{},"构":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}},"理":{"docs":{},"解":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"新":{"docs":{},"概":{"docs":{},"念":{"docs":{},"小":{"docs":{},"结":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"整":{"docs":{},"体":{"docs":{},"架":{"docs":{},"构":{"docs":{},"分":{"docs":{},"析":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"o":{"docs":{},"b":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"(":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},".":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}},"e":{"docs":{},"r":{"docs":{},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"页":{"docs":{},"面":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"实":{"docs":{},"现":{"docs":{},"页":{"docs":{},"面":{"docs":{},"栈":{"docs":{},"刷":{"docs":{},"新":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"顶":{"docs":{},"层":{"docs":{},"容":{"docs":{},"器":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419},"boost-router.html":{"ref":"boost-router.html","tf":0.019801980198019802}},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},"(":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}}}}}}}}},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"实":{"docs":{},"现":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"(":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.01675977653631285}}}}}}}}}}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},".":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.02564102564102564}}}}}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"(":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}},"事":{"docs":{},"件":{"docs":{},"定":{"docs":{},"义":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"方":{"docs":{},"法":{"docs":{},"定":{"docs":{},"义":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"全":{"docs":{},"双":{"docs":{},"工":{"docs":{},"通":{"docs":{},"道":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":10}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"通":{"docs":{},"信":{"docs":{},"通":{"docs":{},"道":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"全":{"docs":{},"双":{"docs":{},"工":{"docs":{},"通":{"docs":{},"道":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}},"通":{"docs":{},"信":{"docs":{},"通":{"docs":{},"道":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}},"l":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},"e":{"docs":{},"r":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}},".":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}},"s":{"docs":{},")":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"(":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}}}}}}}},"/":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"k":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"g":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"i":{"docs":{},"c":{"docs":{},"m":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0625},"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.09539473684210527}}},"_":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}}}}}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"#":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"i":{"docs":{},"f":{"docs":{},"e":{"docs":{},"c":{"docs":{},"y":{"docs":{},"c":{"docs":{},"l":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"#":{"2":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}},"docs":{}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}},"o":{"docs":{},"n":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"h":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.03289473684210526}}}}}}}}}}},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}}}}}}}}}}}}}}}}}}},".":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"(":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"l":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"n":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}},".":{"docs":{},"o":{"docs":{},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"(":{"docs":{},"\"":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"(":{"docs":{},"{":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},"(":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},":":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"r":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196},"boost-container.html":{"ref":"boost-container.html","tf":0.027932960893854747},"boost-router.html":{"ref":"boost-router.html","tf":0.024752475247524754},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}},"r":{"docs":{},"a":{"docs":{},"g":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},")":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.01675977653631285}},"e":{"docs":{},">":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}},".":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}},"n":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},"a":{"docs":{},"l":{"docs":{},"s":{"docs":{},"e":{"docs":{},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"i":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}},"(":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"最":{"docs":{},"近":{"docs":{},"更":{"docs":{},"新":{"docs":{"./":{"ref":"./","tf":0.0625},"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},"p":{"docs":{},"l":{"docs":{},"u":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"的":{"docs":{},"字":{"docs":{},"段":{"docs":{},"注":{"docs":{},"册":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"只":{"docs":{},"是":{"docs":{},"完":{"docs":{},"成":{"docs":{},"通":{"docs":{},"道":{"docs":{},"注":{"docs":{},"册":{"docs":{},",":{"docs":{},"这":{"docs":{},"是":{"docs":{},"插":{"docs":{},"件":{"docs":{},"与":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"通":{"docs":{},"信":{"docs":{},"的":{"docs":{},"核":{"docs":{},"心":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"b":{"docs":{},"a":{"docs":{},"l":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"(":{"docs":{},")":{"docs":{},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0625},"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}},"p":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"(":{"docs":{},"[":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}},"拦":{"docs":{},"截":{"docs":{},"后":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"当":{"docs":{},"前":{"docs":{},"存":{"docs":{},"在":{"docs":{},"原":{"docs":{},"生":{"docs":{},"的":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{},",":{"docs":{},"则":{"docs":{},"优":{"docs":{},"先":{"docs":{},"弹":{"docs":{},"出":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"不":{"docs":{},"存":{"docs":{},"在":{"docs":{},",":{"docs":{},"则":{"docs":{},"通":{"docs":{},"过":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"转":{"docs":{},"发":{"docs":{},"给":{"docs":{},"了":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419},"boost-router.html":{"ref":"boost-router.html","tf":0.019801980198019802}},":":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{},"(":{"2":{"docs":{},")":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"docs":{}}}}}}}},"$":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"(":{"docs":{},"$":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},")":{"docs":{},"'":{"docs":{},")":{"docs":{},";":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}},"i":{"docs":{},"d":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}}},",":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"e":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}}}},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"s":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.019736842105263157},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.011764705882352941},"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419},"boost-router.html":{"ref":"boost-router.html","tf":0.019801980198019802}}},":":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}},"$":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"(":{"docs":{},"\"":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}},"o":{"docs":{},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{},"i":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"[":{"docs":{},"\"":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"]":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{},"\"":{"docs":{},"]":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"]":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},":":{"docs":{},"这":{"docs":{},"个":{"docs":{},"小":{"docs":{},"专":{"docs":{},"栏":{"docs":{},"呢":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"不":{"docs":{},"打":{"docs":{},"算":{"docs":{},"探":{"docs":{},"讨":{"docs":{},"到":{"docs":{},"是":{"docs":{},"选":{"docs":{},"官":{"docs":{},"方":{"docs":{},"的":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"s":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"p":{"docs":{},"e":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},".":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"(":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}},"从":{"docs":{},"事":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{},"开":{"docs":{},"发":{"docs":{},"多":{"docs":{},"年":{"docs":{},"的":{"docs":{},"码":{"docs":{},"农":{"docs":{},"一":{"docs":{},"枚":{"docs":{},",":{"docs":{},"就":{"docs":{},"职":{"docs":{},"于":{"5":{"8":{"docs":{},"同":{"docs":{},"城":{"docs":{},",":{"docs":{},"负":{"docs":{},"责":{"5":{"8":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"的":{"docs":{},"相":{"docs":{},"关":{"docs":{},"研":{"docs":{},"发":{"docs":{},"工":{"docs":{},"作":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}}}}}}}}}},"docs":{}},"docs":{}}}}}}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}},"源":{"docs":{},"码":{"docs":{},"解":{"docs":{},"读":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}}}}}}}}},"其":{"docs":{},"提":{"docs":{},"供":{"docs":{},"的":{"docs":{},"能":{"docs":{},"力":{"docs":{},"来":{"docs":{},"看":{"docs":{},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"是":{"docs":{},"为":{"docs":{},"了":{"docs":{},"从":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"角":{"docs":{},"度":{"docs":{},",":{"docs":{},"封":{"docs":{},"装":{"docs":{},"出":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"生":{"docs":{},"命":{"docs":{},"周":{"docs":{},"期":{"docs":{},"事":{"docs":{},"件":{"docs":{},"。":{"docs":{},"我":{"docs":{},"们":{"docs":{},"知":{"docs":{},"道":{"docs":{},"有":{"docs":{},"状":{"docs":{},"态":{"docs":{},"的":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"本":{"docs":{},"身":{"docs":{},"只":{"docs":{},"有":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"和":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},"事":{"docs":{},"件":{"docs":{},",":{"docs":{},"当":{"docs":{},"页":{"docs":{},"面":{"docs":{},"更":{"docs":{},"新":{"docs":{},"时":{"docs":{},"触":{"docs":{},"发":{"docs":{},"d":{"docs":{},"i":{"docs":{},"d":{"docs":{},"u":{"docs":{},"p":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"关":{"docs":{},"于":{"docs":{},"作":{"docs":{},"者":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}},"本":{"docs":{},"系":{"docs":{},"列":{"docs":{},"文":{"docs":{},"章":{"docs":{},"谢":{"docs":{},"绝":{"docs":{},"转":{"docs":{},"载":{"docs":{},",":{"docs":{},"内":{"docs":{},"容":{"docs":{},"为":{"docs":{},"私":{"docs":{},"有":{"docs":{},"原":{"docs":{},"创":{"docs":{},",":{"docs":{},"如":{"docs":{},"有":{"docs":{},"转":{"docs":{},"载":{"docs":{},"需":{"docs":{},"求":{"docs":{},"请":{"docs":{},"联":{"docs":{},"系":{"docs":{},"作":{"docs":{},"者":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"o":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"w":{"docs":{},"u":{"8":{"9":{"docs":{},"@":{"docs":{},"g":{"docs":{},"m":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},",":{"docs":{},"并":{"docs":{},"保":{"docs":{},"留":{"docs":{},"出":{"docs":{},"处":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}}}}}}}}}}}}}}}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"简":{"docs":{},"介":{"docs":{"./":{"ref":"./","tf":10}}},"答":{"docs":{},"归":{"docs":{},"纳":{"docs":{},"就":{"docs":{},"是":{"docs":{},"切":{"docs":{},"换":{"docs":{},"时":{"docs":{},",":{"docs":{},"新":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"出":{"docs":{},"现":{"docs":{},"和":{"docs":{},"当":{"docs":{},"前":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"消":{"docs":{},"失":{"docs":{},"状":{"docs":{},"态":{"docs":{},",":{"docs":{},"最":{"docs":{},"后":{"docs":{},"还":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"p":{"docs":{},"除":{"docs":{},"了":{"docs":{},"最":{"docs":{},"终":{"docs":{},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{},"情":{"docs":{},"况":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"单":{"docs":{},"来":{"docs":{},"说":{"docs":{},"是":{"docs":{},"在":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"中":{"docs":{},"触":{"docs":{},"发":{"docs":{},"的":{"docs":{},"。":{"docs":{},"我":{"docs":{},"们":{"docs":{},"已":{"docs":{},"经":{"docs":{},"知":{"docs":{},"道":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"本":{"docs":{},"身":{"docs":{},"继":{"docs":{},"承":{"docs":{},"了":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{},"所":{"docs":{},"以":{"docs":{},"它":{"docs":{},"是":{"docs":{},"被":{"docs":{},"当":{"docs":{},"做":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"来":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"。":{"docs":{},"在":{"docs":{},"构":{"docs":{},"建":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"时":{"docs":{},",":{"docs":{},"构":{"docs":{},"造":{"docs":{},"器":{"docs":{},"如":{"docs":{},"下":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"那":{"docs":{},"么":{"docs":{},"究":{"docs":{},"竟":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"是":{"docs":{},"如":{"docs":{},"何":{"docs":{},"实":{"docs":{},"现":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"管":{"docs":{},"理":{"docs":{},"?":{"docs":{},"与":{"docs":{},"原":{"docs":{},"生":{"docs":{},"视":{"docs":{},"图":{"docs":{},"的":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"关":{"docs":{},"系":{"docs":{},"又":{"docs":{},"是":{"docs":{},"怎":{"docs":{},"么":{"docs":{},"样":{"docs":{},"的":{"docs":{},"呢":{"docs":{},"?":{"docs":{},"带":{"docs":{},"着":{"docs":{},"这":{"docs":{},"些":{"docs":{},"疑":{"docs":{},"问":{"docs":{},",":{"docs":{},"开":{"docs":{},"始":{"docs":{},"你":{"docs":{},"的":{"docs":{},"《":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0625}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"这":{"docs":{},"个":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"方":{"docs":{},"法":{"docs":{},"是":{"docs":{},"什":{"docs":{},"么":{"docs":{},"?":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"是":{"docs":{},"如":{"docs":{},"何":{"docs":{},"实":{"docs":{},"现":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"绑":{"docs":{},"定":{"docs":{},"关":{"docs":{},"系":{"docs":{},"?":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}},"#":{"docs":{},"#":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"'":{"0":{"docs":{},".":{"1":{"docs":{},".":{"6":{"1":{"docs":{},"'":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"docs":{}},"docs":{}}},"docs":{}}},"docs":{},"f":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"1":{"docs":{},".":{"9":{"docs":{},"_":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{},"x":{"docs":{},"_":{"docs":{},"u":{"docs":{},"p":{"docs":{},"g":{"docs":{},"r":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},"'":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}},"docs":{}}},"docs":{}}}}}}}}}}}}}}}},"i":{"docs":{},"r":{"docs":{},"s":{"docs":{},"t":{"docs":{},"'":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}},"f":{"docs":{},"r":{"docs":{},"a":{"docs":{},"g":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"'":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"'":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"/":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"b":{"docs":{},"a":{"docs":{},"b":{"docs":{},"a":{"docs":{},"/":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"'":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"'":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"v":{"docs":{},"i":{"docs":{},"e":{"docs":{},"w":{"docs":{},"'":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{},"'":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"'":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"'":{"docs":{},",":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}}}}}}}}}},"/":{"docs":{},"'":{"docs":{},")":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"(":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.019736842105263157}}}}}}}}}},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},".":{"docs":{},"i":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"s":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}},"e":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"?":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"d":{"docs":{},"u":{"docs":{},"l":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"e":{"docs":{},"r":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},".":{"docs":{},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"d":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"a":{"docs":{},"n":{"docs":{},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},"(":{"docs":{},")":{"docs":{},")":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}},"l":{"docs":{},"l":{"docs":{},".":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}},"_":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"[":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"]":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},".":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}},")":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}},"/":{"docs":{},"/":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.01675977653631285}},"/":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.023529411764705882},"boost-container.html":{"ref":"boost-container.html","tf":0.0335195530726257},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901},"method-channel.html":{"ref":"method-channel.html","tf":0.02564102564102564}},"可":{"docs":{},"以":{"docs":{},"在":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"层":{"docs":{},"通":{"docs":{},"过":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}},"t":{"docs":{},"o":{"docs":{},"d":{"docs":{},"o":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}},"r":{"docs":{},"i":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}},"=":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.013157894736842105},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.023529411764705882},"boost-container.html":{"ref":"boost-container.html","tf":0.027932960893854747},"boost-router.html":{"ref":"boost-router.html","tf":0.024752475247524754},"method-channel.html":{"ref":"method-channel.html","tf":0.05128205128205128}},">":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.029605263157894735},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.01568627450980392},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}},"=":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}},">":{"0":{"docs":{},"/":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}},"2":{"docs":{},"/":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}}}}}}},"docs":{}},"[":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},"d":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"g":{"docs":{},"]":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}}},"x":{"docs":{},"d":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"g":{"docs":{},"]":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}},"]":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"d":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"d":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"f":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"]":{"docs":{},".":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"f":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"]":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"d":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{},"f":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"]":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}},"_":{"docs":{},")":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.019736842105263157}}},"o":{"docs":{},"n":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},"e":{"docs":{},"d":{"docs":{},")":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"(":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"e":{"docs":{},".":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},".":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"f":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},".":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"(":{"docs":{},"_":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"w":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"(":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}}}}}}}}}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},",":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},"(":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"[":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"]":{"docs":{},"(":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"[":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"]":{"docs":{},";":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}},".":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"(":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},")":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}},"p":{"docs":{},"i":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}},"扩":{"docs":{},"展":{"docs":{},"小":{"docs":{},"结":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"接":{"docs":{},"入":{"docs":{},"吹":{"docs":{},"水":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}},"p":{"docs":{},",":{"docs":{},"还":{"docs":{},"是":{"docs":{},"选":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"好":{"docs":{},",":{"docs":{},"小":{"docs":{},"孩":{"docs":{},"子":{"docs":{},"才":{"docs":{},"做":{"docs":{},"选":{"docs":{},"择":{"docs":{},"&":{"docs":{},"#":{"docs":{},"x":{"1":{"docs":{},"f":{"6":{"0":{"5":{"docs":{},";":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}},"s":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{},"(":{"docs":{},"_":{"docs":{},"o":{"docs":{},"f":{"docs":{},"f":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},".":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},"(":{"docs":{},"(":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"a":{"docs":{},"l":{"docs":{},"s":{"docs":{},"e":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},".":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}},"n":{"docs":{},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}},"r":{"docs":{},"g":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}},")":{"docs":{},";":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}},".":{"docs":{},"i":{"docs":{},"n":{"docs":{},"v":{"docs":{},"o":{"docs":{},"k":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},">":{"docs":{},"(":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},")":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}},":":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.01644736842105263}}}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}},"就":{"docs":{},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"普":{"docs":{},"通":{"docs":{},"的":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{},"直":{"docs":{},"接":{"docs":{},"继":{"docs":{},"承":{"docs":{},"了":{"docs":{},"原":{"docs":{},"生":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{},"用":{"docs":{},"于":{"docs":{},"承":{"docs":{},"载":{"docs":{},"页":{"docs":{},"面":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"。":{"docs":{},"可":{"docs":{},"以":{"docs":{},"认":{"docs":{},"为":{"docs":{},"他":{"docs":{},"是":{"docs":{},"用":{"docs":{},"了":{"docs":{},"替":{"docs":{},"换":{"docs":{},"原":{"docs":{},"生":{"docs":{},"的":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"的":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}},".":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},".":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}}}}}}}}}}}}},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},".":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},".":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"#":{"2":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}},"docs":{}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},")":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},".":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"l":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"(":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}},"s":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},".":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"{":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}},".":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},"u":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"s":{"docs":{},"[":{"docs":{},"\"":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"\"":{"docs":{},"]":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"]":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{},"]":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},"u":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"]":{"docs":{},";":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"\"":{"docs":{},"]":{"docs":{},";":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}},"s":{"docs":{},"e":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}},"u":{"docs":{},"r":{"docs":{},"r":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"t":{"docs":{},"x":{"docs":{},")":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},"页":{"docs":{},"面":{"docs":{},"切":{"docs":{},"换":{"docs":{},"操":{"docs":{},"作":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"的":{"docs":{},"多":{"docs":{},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{},"管":{"docs":{},"理":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"配":{"docs":{},"置":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}},"配":{"docs":{},"置":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"y":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"'":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"v":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}}}}}}}}}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},"时":{"docs":{},"销":{"docs":{},"毁":{"docs":{},"观":{"docs":{},"察":{"docs":{},"者":{"docs":{},"和":{"docs":{},"历":{"docs":{},"史":{"docs":{},"路":{"docs":{},"由":{"docs":{},"页":{"docs":{},"面":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}},"u":{"docs":{},"m":{"docs":{},"p":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"'":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}},"t":{"docs":{},"s":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}},"}":{"docs":{},")":{"docs":{},"{":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}},"e":{"docs":{},"c":{"docs":{},"u":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}},".":{"docs":{},"t":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"(":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}},"h":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},".":{"docs":{},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"/":{"docs":{},"t":{"docs":{},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{},"s":{"docs":{},"/":{"docs":{},"p":{"docs":{},"u":{"docs":{},"b":{"docs":{},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"/":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"b":{"docs":{},"a":{"docs":{},"b":{"docs":{},"a":{"docs":{},"/":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"/":{"docs":{},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{},"s":{"docs":{},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"l":{"docs":{},"o":{"docs":{},"p":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"/":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}},"(":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},")":{"docs":{},";":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}},"i":{"docs":{},"f":{"docs":{},"e":{"docs":{},"c":{"docs":{},"y":{"docs":{},"c":{"docs":{},"l":{"docs":{},"e":{"docs":{},":":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"i":{"docs":{},"f":{"docs":{},"e":{"docs":{},"c":{"docs":{},"y":{"docs":{},"c":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}}}}},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"y":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"i":{"docs":{},"s":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}},"w":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.02564102564102564}},")":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}},"o":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"l":{"docs":{},"o":{"docs":{},"g":{"docs":{},"(":{"docs":{},"\"":{"docs":{},"o":{"docs":{},"n":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"h":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}},"'":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"#":{"2":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}},"docs":{}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}},"(":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},",":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}},"e":{"docs":{},"r":{"docs":{},"是":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"容":{"docs":{},"器":{"docs":{},"的":{"docs":{},"管":{"docs":{},"理":{"docs":{},",":{"docs":{},"提":{"docs":{},"供":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},",":{"docs":{},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"等":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"。":{"docs":{},"它":{"docs":{},"本":{"docs":{},"身":{"docs":{},"也":{"docs":{},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{},"通":{"docs":{},"过":{"docs":{},"对":{"docs":{},"外":{"docs":{},"暴":{"docs":{},"露":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},",":{"docs":{},"提":{"docs":{},"供":{"docs":{},"了":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"操":{"docs":{},"作":{"docs":{},"。":{"docs":{},"这":{"docs":{},"个":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"内":{"docs":{},"部":{"docs":{},"管":{"docs":{},"理":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"组":{"docs":{},"件":{"docs":{},",":{"docs":{},"从":{"docs":{},"而":{"docs":{},"实":{"docs":{},"现":{"docs":{},"了":{"docs":{},"多":{"docs":{},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"管":{"docs":{},"理":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.01485148514851485},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}},"(":{"docs":{},")":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}},")":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"(":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.02564102564102564}},"(":{"docs":{},"\"":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"配":{"docs":{},"置":{"docs":{},"和":{"docs":{},"原":{"docs":{},"因":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}},"配":{"docs":{},"置":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}},"层":{"docs":{},"的":{"docs":{},"引":{"docs":{},"擎":{"docs":{},"复":{"docs":{},"用":{"docs":{},"处":{"docs":{},"理":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}},"m":{"docs":{},"e":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}},":":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}},"s":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}},".":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"(":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"k":{"docs":{},"n":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"w":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}},"o":{"docs":{},"w":{"docs":{},":":{"0":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}},"2":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}},"docs":{}}}},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},")":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}},";":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}},"o":{"docs":{},"f":{"docs":{},"f":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"#":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}}}}}},"l":{"docs":{},"d":{"docs":{},":":{"0":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}},"2":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}},"docs":{},"n":{"docs":{},"u":{"docs":{},"l":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"e":{"docs":{},"#":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"k":{"docs":{},"n":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"(":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"(":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}},"w":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"?":{"docs":{},".":{"docs":{},"r":{"docs":{},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{},"s":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{},"s":{"docs":{},"n":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}},"m":{"docs":{},"o":{"docs":{},"v":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}},":":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}},"]":{"docs":{},")":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.011764705882352941},"boost-container.html":{"ref":"boost-container.html","tf":0.0223463687150838},"boost-router.html":{"ref":"boost-router.html","tf":0.019801980198019802},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"(":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"?":{"docs":{},".":{"docs":{},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{},"(":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}},"u":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}},"e":{"docs":{},")":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"r":{"docs":{},"h":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"y":{"docs":{},".":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"(":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},")":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}},";":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}},"e":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{},"s":{"docs":{},"n":{"docs":{},"o":{"docs":{},"d":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"(":{"docs":{},"(":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},"v":{"docs":{},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},".":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{},";":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}}}}}}}}},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}}},"u":{"docs":{},"r":{"docs":{},"f":{"docs":{},"a":{"docs":{},"c":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"(":{"docs":{},"f":{"docs":{},"n":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},"(":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"d":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},".":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"f":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"(":{"docs":{},"(":{"docs":{},"d":{"docs":{},"u":{"docs":{},"r":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},".":{"docs":{},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"s":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.011764705882352941},"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419},"boost-router.html":{"ref":"boost-router.html","tf":0.019801980198019802},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}},"i":{"docs":{},"t":{"docs":{},"l":{"docs":{},"e":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}},"r":{"docs":{},"i":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}},"u":{"docs":{},"e":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}},"y":{"docs":{},"p":{"docs":{},"i":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"y":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}},"h":{"docs":{},"i":{"docs":{},"s":{"docs":{},".":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"}":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},",":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}},"u":{"docs":{},"i":{"docs":{},"d":{"docs":{},"/":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}}},"r":{"docs":{},"l":{"docs":{},",":{"docs":{},"{":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},",":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},":":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}},";":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}},"s":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}}},"v":{"0":{"docs":{},".":{"1":{"docs":{},".":{"6":{"1":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"docs":{}},"docs":{}}},"docs":{}}},"docs":{},"i":{"docs":{},"e":{"docs":{},"w":{"docs":{},",":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},",":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"等":{"docs":{},",":{"docs":{},"并":{"docs":{},"不":{"docs":{},"是":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"独":{"docs":{},"有":{"docs":{},"的":{"docs":{},"。":{"docs":{},"对":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"源":{"docs":{},"码":{"docs":{},"分":{"docs":{},"析":{"docs":{},"将":{"docs":{},"在":{"docs":{},"后":{"docs":{},"续":{"docs":{},"章":{"docs":{},"节":{"docs":{},"逐":{"docs":{},"一":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},":":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}},"$":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}},"s":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},".":{"docs":{},"p":{"docs":{},"i":{"docs":{},"p":{"docs":{},"e":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"?":{"docs":{},".":{"docs":{},"s":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{},"s":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}},"l":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578},"boost-router.html":{"ref":"boost-router.html","tf":0.009900990099009901}}}}}}}}}}}}},"在":{"docs":{},"源":{"docs":{},"码":{"docs":{},"中":{"docs":{},"不":{"docs":{},"会":{"docs":{},"通":{"docs":{},"知":{"docs":{},"其":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"的":{"docs":{},"生":{"docs":{},"命":{"docs":{},"周":{"docs":{},"期":{"docs":{},"回":{"docs":{},"调":{"docs":{},",":{"docs":{},"d":{"docs":{},"i":{"docs":{},"d":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"会":{"docs":{},"通":{"docs":{},"知":{"docs":{},"。":{"docs":{},"除":{"docs":{},"此":{"docs":{},"之":{"docs":{},"外":{"docs":{},",":{"docs":{},"两":{"docs":{},"者":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"中":{"docs":{},"都":{"docs":{},"有":{"docs":{},"对":{"docs":{},"页":{"docs":{},"码":{"docs":{},"创":{"docs":{},"建":{"docs":{},"。":{"docs":{},"为":{"docs":{},"什":{"docs":{},"么":{"docs":{},"会":{"docs":{},"存":{"docs":{},"在":{"docs":{},"这":{"docs":{},"种":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},",":{"docs":{},"目":{"docs":{},"前":{"docs":{},"单":{"docs":{},"纯":{"docs":{},"分":{"docs":{},"析":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},"代":{"docs":{},"码":{"docs":{},"得":{"docs":{},"不":{"docs":{},"到":{"docs":{},"解":{"docs":{},"释":{"docs":{},",":{"docs":{},"后":{"docs":{},"续":{"docs":{},"在":{"docs":{},"分":{"docs":{},"析":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"源":{"docs":{},"码":{"docs":{},"时":{"docs":{},"可":{"docs":{},"以":{"docs":{},"进":{"docs":{},"一":{"docs":{},"步":{"docs":{},"确":{"docs":{},"认":{"docs":{},"相":{"docs":{},"关":{"docs":{},"调":{"docs":{},"用":{"docs":{},"链":{"docs":{},"路":{"docs":{},"。":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"y":{"docs":{},"a":{"docs":{},"m":{"docs":{},"l":{"docs":{},"配":{"docs":{},"置":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"集":{"docs":{},"成":{"docs":{},"方":{"docs":{},"式":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}},"{":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.058823529411764705},"boost-container.html":{"ref":"boost-container.html","tf":0.05027932960893855},"boost-router.html":{"ref":"boost-router.html","tf":0.04455445544554455},"method-channel.html":{"ref":"method-channel.html","tf":0.05128205128205128}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},"=":{"0":{"docs":{},",":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"=":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"}":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}}}}}}}},"2":{"docs":{},",":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"=":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{},"}":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.006578947368421052}}}}}}}}}}}}}}}},"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},",":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"=":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"}":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.009868421052631578}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"}":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}},"t":{"docs":{},"h":{"docs":{},"i":{"docs":{},"s":{"docs":{},".":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}},"}":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.054901960784313725},"boost-container.html":{"ref":"boost-container.html","tf":0.0446927374301676},"boost-router.html":{"ref":"boost-router.html","tf":0.034653465346534656},"method-channel.html":{"ref":"method-channel.html","tf":0.05128205128205128}},")":{"docs":{},";":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}},",":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}},"e":{"docs":{},"l":{"docs":{},"s":{"docs":{},"e":{"docs":{},"{":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}},"下":{"docs":{},"面":{"docs":{},"是":{"docs":{},"以":{"docs":{},"i":{"docs":{},"o":{"docs":{},"s":{"docs":{},"为":{"docs":{},"例":{"docs":{},",":{"docs":{},"输":{"docs":{},"出":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"状":{"docs":{},"态":{"docs":{},"变":{"docs":{},"化":{"docs":{},"日":{"docs":{},"志":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}},"我":{"docs":{},"再":{"docs":{},"结":{"docs":{},"合":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"里":{"docs":{},"面":{"docs":{},"的":{"docs":{},"一":{"docs":{},"些":{"docs":{},"新":{"docs":{},"名":{"docs":{},"词":{"docs":{},",":{"docs":{},"理":{"docs":{},"解":{"docs":{},"他":{"docs":{},"们":{"docs":{},"的":{"docs":{},"实":{"docs":{},"际":{"docs":{},"含":{"docs":{},"义":{"docs":{},"和":{"docs":{},"作":{"docs":{},"用":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"们":{"docs":{},"通":{"docs":{},"过":{"docs":{},"一":{"docs":{},"张":{"docs":{},"图":{"docs":{},",":{"docs":{},"来":{"docs":{},"概":{"docs":{},"括":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"所":{"docs":{},"做":{"docs":{},"的":{"docs":{},"事":{"docs":{},"情":{"docs":{},":":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"为":{"docs":{},"什":{"docs":{},"么":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},"页":{"docs":{},"面":{"docs":{},"切":{"docs":{},"换":{"docs":{},"要":{"docs":{},"通":{"docs":{},"过":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"侧":{"docs":{},"?":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}},"了":{"docs":{},"让":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"更":{"docs":{},"接":{"docs":{},"地":{"docs":{},"气":{"docs":{},",":{"docs":{},"我":{"docs":{},"决":{"docs":{},"定":{"docs":{},"把":{"docs":{},"我":{"docs":{},"对":{"docs":{},"源":{"docs":{},"码":{"docs":{},"的":{"docs":{},"理":{"docs":{},"解":{"docs":{},",":{"docs":{},"重":{"docs":{},"新":{"docs":{},"画":{"docs":{},"一":{"docs":{},"张":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{},"图":{"docs":{},",":{"docs":{},"让":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"落":{"docs":{},"到":{"docs":{},"地":{"docs":{},"上":{"docs":{},",":{"docs":{},"避":{"docs":{},"免":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"被":{"docs":{},"整":{"docs":{},"张":{"docs":{},"架":{"docs":{},"构":{"docs":{},"图":{"docs":{},"给":{"docs":{},"\"":{"docs":{},"劝":{"docs":{},"退":{"docs":{},"\"":{"docs":{},"了":{"docs":{},"。":{"docs":{},"(":{"docs":{},"这":{"docs":{},"里":{"docs":{},"不":{"docs":{},"是":{"docs":{},"吐":{"docs":{},"槽":{"docs":{},"原":{"docs":{},"图":{"docs":{},",":{"docs":{},"也":{"docs":{},"不":{"docs":{},"代":{"docs":{},"表":{"docs":{},"原":{"docs":{},"图":{"docs":{},"表":{"docs":{},"达":{"docs":{},"有":{"docs":{},"何":{"docs":{},"不":{"docs":{},"当":{"docs":{},"之":{"docs":{},"处":{"docs":{},")":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"但":{"docs":{},"是":{"docs":{},"这":{"docs":{},"里":{"docs":{},"针":{"docs":{},"对":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},",":{"docs":{},"是":{"docs":{},"需":{"docs":{},"要":{"docs":{},"一":{"docs":{},"些":{"docs":{},"操":{"docs":{},"作":{"docs":{},"的":{"docs":{},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"原":{"docs":{},"因":{"docs":{},"有":{"docs":{},"两":{"docs":{},"点":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"入":{"docs":{},"口":{"docs":{},"配":{"docs":{},"置":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}},"栈":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},"全":{"docs":{},"文":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"均":{"docs":{},"指":{"docs":{},"代":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}},"在":{"docs":{},"开":{"docs":{},"始":{"docs":{},"之":{"docs":{},"前":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"做":{"docs":{},"一":{"docs":{},"下":{"docs":{},"约":{"docs":{},"定":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}},"我":{"docs":{},"们":{"docs":{},"画":{"docs":{},"的":{"docs":{},"那":{"docs":{},"张":{"docs":{},"图":{"docs":{},"中":{"docs":{},",":{"docs":{},"隐":{"docs":{},"去":{"docs":{},"了":{"docs":{},"关":{"docs":{},"于":{"docs":{},"路":{"docs":{},"由":{"docs":{},"的":{"docs":{},"几":{"docs":{},"个":{"docs":{},"元":{"docs":{},"素":{"docs":{},"和":{"docs":{},"箭":{"docs":{},"头":{"docs":{},",":{"docs":{},"同":{"docs":{},"时":{"docs":{},"我":{"docs":{},"们":{"docs":{},"把":{"docs":{},"新":{"docs":{},"的":{"docs":{},"名":{"docs":{},"词":{"docs":{},"换":{"docs":{},"为":{"docs":{},"了":{"docs":{},"原":{"docs":{},"生":{"docs":{},"名":{"docs":{},"词":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"整":{"docs":{},"个":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"里":{"docs":{},"面":{"docs":{},"他":{"docs":{},"的":{"docs":{},"核":{"docs":{},"心":{"docs":{},"有":{"docs":{},"两":{"docs":{},"个":{"docs":{},":":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}},"修":{"docs":{},"改":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"的":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"分":{"docs":{},"几":{"docs":{},"步":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}},"执":{"docs":{},"行":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"函":{"docs":{},"数":{"docs":{},"前":{"docs":{},"有":{"docs":{},"一":{"docs":{},"个":{"docs":{},"判":{"docs":{},"断":{"docs":{},":":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"?":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"没":{"docs":{},"有":{"docs":{},"看":{"docs":{},"到":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"重":{"docs":{},"载":{"docs":{},",":{"docs":{},"上":{"docs":{},"下":{"docs":{},"文":{"docs":{},"中":{"docs":{},",":{"docs":{},"也":{"docs":{},"不":{"docs":{},"涉":{"docs":{},"及":{"docs":{},"页":{"docs":{},"面":{"docs":{},"构":{"docs":{},"建":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"。":{"docs":{},"回":{"docs":{},"顾":{"docs":{},"下":{"docs":{},"我":{"docs":{},"们":{"docs":{},"前":{"docs":{},"面":{"docs":{},"分":{"docs":{},"析":{"docs":{},"的":{"docs":{},"嵌":{"docs":{},"套":{"docs":{},"关":{"docs":{},"系":{"docs":{},"图":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"中":{"docs":{},",":{"docs":{},"经":{"docs":{},"常":{"docs":{},"通":{"docs":{},"过":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"来":{"docs":{},"实":{"docs":{},"现":{"docs":{},"视":{"docs":{},"图":{"docs":{},"的":{"docs":{},"按":{"docs":{},"需":{"docs":{},"构":{"docs":{},"建":{"docs":{},"。":{"docs":{},"这":{"docs":{},"里":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"定":{"docs":{},"义":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"页":{"docs":{},"面":{"docs":{},"配":{"docs":{},"置":{"docs":{},"的":{"docs":{},"模":{"docs":{},"型":{"docs":{},"。":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"根":{"docs":{},"据":{"docs":{},"不":{"docs":{},"同":{"docs":{},"的":{"docs":{},"使":{"docs":{},"用":{"docs":{},"场":{"docs":{},"景":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"可":{"docs":{},"以":{"docs":{},"进":{"docs":{},"一":{"docs":{},"步":{"docs":{},"细":{"docs":{},"分":{"docs":{},",":{"docs":{},"目":{"docs":{},"前":{"docs":{},"提":{"docs":{},"供":{"docs":{},"的":{"docs":{},"有":{"docs":{},":":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"与":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"通":{"docs":{},"信":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},",":{"docs":{},"框":{"docs":{},"架":{"docs":{},"本":{"docs":{},"身":{"docs":{},"提":{"docs":{},"供":{"docs":{},"了":{"docs":{},"一":{"docs":{},"套":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"机":{"docs":{},"制":{"docs":{},",":{"docs":{},"方":{"docs":{},"便":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"进":{"docs":{},"行":{"docs":{},"数":{"docs":{},"据":{"docs":{},"的":{"docs":{},"双":{"docs":{},"向":{"docs":{},"读":{"docs":{},"写":{"docs":{},"。":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"容":{"docs":{},"器":{"docs":{},"中":{"docs":{},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"重":{"docs":{},"载":{"docs":{},"的":{"docs":{},"是":{"docs":{},"路":{"docs":{},"由":{"docs":{},"的":{"docs":{},"相":{"docs":{},"关":{"docs":{},"出":{"docs":{},"栈":{"docs":{},"、":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"操":{"docs":{},"作":{"docs":{},"。":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"《":{"docs":{},"顶":{"docs":{},"层":{"docs":{},"容":{"docs":{},"器":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"》":{"docs":{},"一":{"docs":{},"节":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"通":{"docs":{},"过":{"docs":{},"检":{"docs":{},"索":{"docs":{},"路":{"docs":{},"由":{"docs":{},"表":{"docs":{},"被":{"docs":{},"调":{"docs":{},"用":{"docs":{},"的":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},",":{"docs":{},"知":{"docs":{},"道":{"docs":{},"当":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},"收":{"docs":{},"到":{"docs":{},"页":{"docs":{},"面":{"docs":{},"创":{"docs":{},"建":{"docs":{},"事":{"docs":{},"件":{"docs":{},"w":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"时":{"docs":{},",":{"docs":{},"回":{"docs":{},"去":{"docs":{},"实":{"docs":{},"例":{"docs":{},"化":{"docs":{},"一":{"docs":{},"个":{"docs":{},"页":{"docs":{},"面":{"docs":{},"。":{"docs":{},"实":{"docs":{},"例":{"docs":{},"化":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},",":{"docs":{},"根":{"docs":{},"据":{"docs":{},"事":{"docs":{},"件":{"docs":{},"的":{"docs":{},"参":{"docs":{},"数":{"docs":{},",":{"docs":{},"构":{"docs":{},"造":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"页":{"docs":{},"面":{"docs":{},"维":{"docs":{},"度":{"docs":{},"的":{"docs":{},"配":{"docs":{},"置":{"docs":{},",":{"docs":{},"叫":{"docs":{},"做":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},",":{"docs":{},"配":{"docs":{},"置":{"docs":{},"中":{"docs":{},"的":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"是":{"docs":{},"用":{"docs":{},"和":{"docs":{},"原":{"docs":{},"生":{"docs":{},"路":{"docs":{},"由":{"docs":{},"配":{"docs":{},"合":{"docs":{},"工":{"docs":{},"作":{"docs":{},"的":{"docs":{},"。":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"使":{"docs":{},"用":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"可":{"docs":{},"以":{"docs":{},"观":{"docs":{},"测":{"docs":{},"到":{"docs":{},"很":{"docs":{},"多":{"docs":{},"标":{"docs":{},"签":{"docs":{},"日":{"docs":{},"志":{"docs":{},"输":{"docs":{},"出":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"要":{"docs":{},"查":{"docs":{},"方":{"docs":{},"法":{"docs":{},"相":{"docs":{},"关":{"docs":{},"的":{"docs":{},"日":{"docs":{},"志":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"过":{"docs":{},"滤":{"docs":{},"关":{"docs":{},"键":{"docs":{},"词":{"docs":{},"o":{"docs":{},"n":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"h":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"。":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"前":{"docs":{},"面":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"分":{"docs":{},"析":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},",":{"docs":{},"多":{"docs":{},"次":{"docs":{},"提":{"docs":{},"到":{"docs":{},"了":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"通":{"docs":{},"道":{"docs":{},"的":{"docs":{},"使":{"docs":{},"用":{"docs":{},"。":{"docs":{},"这":{"docs":{},"块":{"docs":{},"通":{"docs":{},"道":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"都":{"docs":{},"在":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},".":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"中":{"docs":{},",":{"docs":{},"c":{"docs":{},"o":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"有":{"docs":{},"调":{"docs":{},"度":{"docs":{},"员":{"docs":{},"的":{"docs":{},"意":{"docs":{},"思":{"docs":{},",":{"docs":{},"这":{"docs":{},"大":{"docs":{},"概":{"docs":{},"就":{"docs":{},"是":{"docs":{},"路":{"docs":{},"由":{"docs":{},"管":{"docs":{},"理":{"docs":{},"封":{"docs":{},"装":{"docs":{},"类":{"docs":{},"命":{"docs":{},"名":{"docs":{},"的":{"docs":{},"原":{"docs":{},"因":{"docs":{},"吧":{"docs":{},"。":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"里":{"docs":{},"面":{"docs":{},"通":{"docs":{},"信":{"docs":{},"的":{"docs":{},"场":{"docs":{},"景":{"docs":{},"主":{"docs":{},"要":{"docs":{},"是":{"docs":{},"定":{"docs":{},"义":{"docs":{},"双":{"docs":{},"方":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"栈":{"docs":{},"操":{"docs":{},"作":{"docs":{},"和":{"docs":{},"相":{"docs":{},"关":{"docs":{},"联":{"docs":{},"的":{"docs":{},"事":{"docs":{},"件":{"docs":{},"消":{"docs":{},"息":{"docs":{},",":{"docs":{},"它":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"是":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"源":{"docs":{},"码":{"docs":{},"中":{"docs":{},",":{"docs":{},"定":{"docs":{},"义":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},"类":{"docs":{},",":{"docs":{},"内":{"docs":{},"部":{"docs":{},"封":{"docs":{},"装":{"docs":{},"了":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"的":{"docs":{},"使":{"docs":{},"用":{"docs":{},"。":{"docs":{},"它":{"docs":{},"定":{"docs":{},"义":{"docs":{},"了":{"docs":{},"两":{"docs":{},"大":{"docs":{},"类":{"docs":{},"操":{"docs":{},"作":{"docs":{},",":{"docs":{},"收":{"docs":{},"消":{"docs":{},"息":{"docs":{},"和":{"docs":{},"发":{"docs":{},"消":{"docs":{},"息":{"docs":{},"。":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"如":{"docs":{},"果":{"docs":{},"您":{"docs":{},"已":{"docs":{},"经":{"docs":{},"充":{"docs":{},"分":{"docs":{},"了":{"docs":{},"解":{"docs":{},"如":{"docs":{},"何":{"docs":{},"使":{"docs":{},"用":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"选":{"docs":{},"择":{"docs":{},"性":{"docs":{},"的":{"docs":{},"快":{"docs":{},"速":{"docs":{},"跳":{"docs":{},"过":{"docs":{},"本":{"docs":{},"节":{"docs":{},"。":{"docs":{},"下":{"docs":{},"面":{"docs":{},"我":{"docs":{},"们":{"docs":{},"一":{"docs":{},"步":{"docs":{},"步":{"docs":{},"先":{"docs":{},"把":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"集":{"docs":{},"成":{"docs":{},"进":{"docs":{},"来":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"当":{"docs":{},"前":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"正":{"docs":{},"在":{"docs":{},"进":{"docs":{},"程":{"docs":{},"绘":{"docs":{},"制":{"docs":{},"调":{"docs":{},"度":{"docs":{},",":{"docs":{},"那":{"docs":{},"么":{"docs":{},"将":{"docs":{},"刷":{"docs":{},"新":{"docs":{},"动":{"docs":{},"作":{"docs":{},"延":{"docs":{},"迟":{"docs":{},"加":{"docs":{},"入":{"docs":{},"下":{"docs":{},"一":{"docs":{},"次":{"docs":{},"绘":{"docs":{},"制":{"docs":{},"的":{"docs":{},"回":{"docs":{},"调":{"docs":{},"函":{"docs":{},"数":{"docs":{},"中":{"docs":{},"。":{"docs":{},"根":{"docs":{},"据":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"注":{"docs":{},"释":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"知":{"docs":{},"道":{"docs":{},"当":{"docs":{},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"s":{"docs":{},"n":{"docs":{},"t":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"代":{"docs":{},"表":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"/":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"之":{"docs":{},"一":{"docs":{},"正":{"docs":{},"在":{"docs":{},"被":{"docs":{},"执":{"docs":{},"行":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"读":{"docs":{},"者":{"docs":{},"对":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"的":{"docs":{},"使":{"docs":{},"用":{"docs":{},"不":{"docs":{},"慎":{"docs":{},"了":{"docs":{},"解":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"参":{"docs":{},"考":{"docs":{},"通":{"docs":{},"道":{"docs":{},"的":{"docs":{},"使":{"docs":{},"用":{"docs":{},"文":{"docs":{},"档":{"docs":{},",":{"docs":{},"写":{"docs":{},"的":{"docs":{},"比":{"docs":{},"较":{"docs":{},"清":{"docs":{},"楚":{"docs":{},":":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"完":{"docs":{},"成":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"配":{"docs":{},"置":{"docs":{},"后":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"按":{"docs":{},"需":{"docs":{},"同":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"进":{"docs":{},"去":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"切":{"docs":{},"换":{"docs":{},"。":{"docs":{},"页":{"docs":{},"面":{"docs":{},"管":{"docs":{},"理":{"docs":{},"的":{"docs":{},"核":{"docs":{},"心":{"docs":{},"在":{"docs":{},"于":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"侧":{"docs":{},",":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},"需":{"docs":{},"要":{"docs":{},"切":{"docs":{},"换":{"docs":{},"页":{"docs":{},"面":{"docs":{},"时":{"docs":{},"通":{"docs":{},"过":{"docs":{},"静":{"docs":{},"态":{"docs":{},"通":{"docs":{},"道":{"docs":{},"发":{"docs":{},"起":{"docs":{},"事":{"docs":{},"件":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"小":{"docs":{},"结":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526},"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}},"开":{"docs":{},"发":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"的":{"docs":{},"小":{"docs":{},"伙":{"docs":{},"伴":{"docs":{},"应":{"docs":{},"该":{"docs":{},"都":{"docs":{},"知":{"docs":{},"道":{"docs":{},",":{"docs":{},"目":{"docs":{},"前":{"docs":{},"社":{"docs":{},"区":{"docs":{},"内":{"docs":{},"开":{"docs":{},"源":{"docs":{},"且":{"docs":{},"比":{"docs":{},"较":{"docs":{},"成":{"docs":{},"熟":{"docs":{},"的":{"docs":{},"混":{"docs":{},"合":{"docs":{},"框":{"docs":{},"架":{"docs":{},"非":{"docs":{},"常":{"docs":{},"少":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"扩":{"docs":{},"展":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},"既":{"docs":{},"可":{"docs":{},"以":{"docs":{},"开":{"docs":{},"始":{"docs":{},"使":{"docs":{},"用":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"了":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"你":{"docs":{},"查":{"docs":{},"看":{"docs":{},"项":{"docs":{},"目":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"会":{"docs":{},"发":{"docs":{},"现":{"docs":{},",":{"docs":{},"文":{"docs":{},"档":{"docs":{},"建":{"docs":{},"设":{"docs":{},"上":{"docs":{},"面":{"docs":{},"还":{"docs":{},"是":{"docs":{},"有":{"docs":{},"提":{"docs":{},"高":{"docs":{},"空":{"docs":{},"间":{"docs":{},"的":{"docs":{},",":{"docs":{},"在":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"e":{"docs":{},".":{"docs":{},"m":{"docs":{},"d":{"docs":{},"中":{"docs":{},"对":{"docs":{},"接":{"docs":{},"入":{"docs":{},"的":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"只":{"docs":{},"有":{"docs":{},"一":{"docs":{},"句":{"docs":{},"话":{"docs":{},"&":{"docs":{},"#":{"docs":{},"x":{"1":{"docs":{},"f":{"6":{"4":{"3":{"docs":{},";":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"来":{"docs":{},"传":{"docs":{},"递":{"docs":{},"参":{"docs":{},"数":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}},"正":{"docs":{},"常":{"docs":{},"来":{"docs":{},"说":{"docs":{},",":{"docs":{},"一":{"docs":{},"个":{"docs":{},"标":{"docs":{},"准":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"插":{"docs":{},"件":{"docs":{},"不":{"docs":{},"应":{"docs":{},"该":{"docs":{},"要":{"docs":{},"求":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},",":{"docs":{},"过":{"docs":{},"多":{"docs":{},"的":{"docs":{},"手":{"docs":{},"工":{"docs":{},"去":{"docs":{},"修":{"docs":{},"改":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"配":{"docs":{},"置":{"docs":{},",":{"docs":{},"绝":{"docs":{},"大":{"docs":{},"部":{"docs":{},"分":{"docs":{},"的":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"插":{"docs":{},"件":{"docs":{},"会":{"docs":{},"通":{"docs":{},"过":{"docs":{},"自":{"docs":{},"动":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},"p":{"docs":{},"l":{"docs":{},"u":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"完":{"docs":{},"成":{"docs":{},"插":{"docs":{},"件":{"docs":{},"注":{"docs":{},"册":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"修":{"docs":{},"改":{"docs":{},"稿":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"一":{"docs":{},"定":{"docs":{},"是":{"docs":{},"在":{"docs":{},"{":{"docs":{},"}":{"docs":{},"中":{"docs":{},"改":{"docs":{},"变":{"docs":{},"的":{"docs":{},"状":{"docs":{},"态":{"docs":{},"属":{"docs":{},"性":{"docs":{},",":{"docs":{},"并":{"docs":{},"且":{"docs":{},"该":{"docs":{},"属":{"docs":{},"性":{"docs":{},"会":{"docs":{},"被":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"直":{"docs":{},"接":{"docs":{},"、":{"docs":{},"间":{"docs":{},"接":{"docs":{},"引":{"docs":{},"用":{"docs":{},",":{"docs":{},"才":{"docs":{},"能":{"docs":{},"达":{"docs":{},"到":{"docs":{},"刷":{"docs":{},"新":{"docs":{},"目":{"docs":{},"的":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"添":{"docs":{},"加":{"docs":{},"完":{"docs":{},"依":{"docs":{},"赖":{"docs":{},"库":{"docs":{},"后":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"进":{"docs":{},"行":{"docs":{},"相":{"docs":{},"应":{"docs":{},"的":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"配":{"docs":{},"置":{"docs":{},"。":{"docs":{},"这":{"docs":{},"里":{"docs":{},"配":{"docs":{},"置":{"docs":{},"主":{"docs":{},"要":{"docs":{},"有":{"docs":{},"两":{"docs":{},"块":{"docs":{},",":{"docs":{},"分":{"docs":{},"别":{"docs":{},"是":{"docs":{},"如":{"docs":{},"有":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"和":{"docs":{},"入":{"docs":{},"口":{"docs":{},"配":{"docs":{},"置":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"类":{"docs":{},"似":{"docs":{},"的":{"docs":{},",":{"docs":{},"当":{"docs":{},"调":{"docs":{},"用":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},",":{"docs":{},"页":{"docs":{},"面":{"docs":{},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{},"发":{"docs":{},"生":{"docs":{},"变":{"docs":{},"化":{"docs":{},",":{"docs":{},"也":{"docs":{},"有":{"docs":{},"对":{"docs":{},"应":{"docs":{},"状":{"docs":{},"态":{"docs":{},"切":{"docs":{},"换":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"路":{"docs":{},"由":{"docs":{},"配":{"docs":{},"置":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}},"绑":{"docs":{},"定":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"这":{"docs":{},"一":{"docs":{},"节":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"介":{"docs":{},"绍":{"docs":{},"了":{"docs":{},"集":{"docs":{},"成":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"几":{"docs":{},"个":{"docs":{},"关":{"docs":{},"键":{"docs":{},"点":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}},"我":{"docs":{},"们":{"docs":{},"分":{"docs":{},"析":{"docs":{},"页":{"docs":{},"面":{"docs":{},"容":{"docs":{},"器":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"。":{"docs":{},"通":{"docs":{},"过":{"docs":{},"源":{"docs":{},"码":{"docs":{},"对":{"docs":{},"比":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"知":{"docs":{},"道":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"参":{"docs":{},"考":{"docs":{},"了":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"内":{"docs":{},"部":{"docs":{},"的":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"实":{"docs":{},"现":{"docs":{},",":{"docs":{},"进":{"docs":{},"行":{"docs":{},"了":{"docs":{},"相":{"docs":{},"应":{"docs":{},"的":{"docs":{},"调":{"docs":{},"整":{"docs":{},",":{"docs":{},"更":{"docs":{},"严":{"docs":{},"格":{"docs":{},"的":{"docs":{},"说":{"docs":{},"是":{"docs":{},"继":{"docs":{},"承":{"docs":{},"了":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"。":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"的":{"docs":{},"标":{"docs":{},"题":{"docs":{},"\"":{"docs":{},"偷":{"docs":{},"用":{"docs":{},"\"":{"docs":{},"了":{"docs":{},"数":{"docs":{},"据":{"docs":{},"通":{"docs":{},"信":{"docs":{},"中":{"docs":{},"的":{"docs":{},"\"":{"docs":{},"双":{"docs":{},"工":{"docs":{},"\"":{"docs":{},"概":{"docs":{},"念":{"docs":{},",":{"docs":{},"来":{"docs":{},"表":{"docs":{},"示":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"通":{"docs":{},"信":{"docs":{},"的":{"docs":{},"能":{"docs":{},"力":{"docs":{},"。":{"docs":{},"通":{"docs":{},"过":{"docs":{},"在":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"和":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},"定":{"docs":{},"义":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"通":{"docs":{},"道":{"docs":{},",":{"docs":{},"开":{"docs":{},"发":{"docs":{},"者":{"docs":{},"可":{"docs":{},"以":{"docs":{},"非":{"docs":{},"常":{"docs":{},"简":{"docs":{},"单":{"docs":{},"就":{"docs":{},"实":{"docs":{},"现":{"docs":{},"框":{"docs":{},"架":{"docs":{},"级":{"docs":{},"别":{"docs":{},"的":{"docs":{},"数":{"docs":{},"据":{"docs":{},"交":{"docs":{},"互":{"docs":{},"。":{"docs":{},"这":{"docs":{},"比":{"docs":{},"w":{"docs":{},"e":{"docs":{},"b":{"docs":{},"v":{"docs":{},"i":{"docs":{},"e":{"docs":{},"w":{"docs":{},"和":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"直":{"docs":{},"接":{"docs":{},"的":{"docs":{},"通":{"docs":{},"信":{"docs":{},"好":{"docs":{},"用":{"docs":{},"很":{"docs":{},"多":{"docs":{},",":{"docs":{},"性":{"docs":{},"能":{"docs":{},"也":{"docs":{},"更":{"docs":{},"优":{"docs":{},",":{"docs":{},"并":{"docs":{},"且":{"docs":{},"不":{"docs":{},"会":{"docs":{},"触":{"docs":{},"发":{"docs":{},"字":{"docs":{},"符":{"docs":{},"串":{"docs":{},"长":{"docs":{},"度":{"docs":{},"问":{"docs":{},"题":{"docs":{},"导":{"docs":{},"致":{"docs":{},"的":{"docs":{},"通":{"docs":{},"信":{"docs":{},"内":{"docs":{},"容":{"docs":{},"截":{"docs":{},"断":{"docs":{},",":{"docs":{},"有":{"docs":{},"点":{"docs":{},"扯":{"docs":{},"远":{"docs":{},"了":{"docs":{},"。":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"套":{"docs":{},"方":{"docs":{},"案":{"docs":{},"有":{"docs":{},"不":{"docs":{},"少":{"docs":{},"团":{"docs":{},"队":{"docs":{},"也":{"docs":{},"采":{"docs":{},"纳":{"docs":{},"了":{"docs":{},",":{"docs":{},"并":{"docs":{},"且":{"docs":{},"还":{"docs":{},"基":{"docs":{},"于":{"docs":{},"这":{"docs":{},"个":{"docs":{},"方":{"docs":{},"案":{"docs":{},"做":{"docs":{},"过":{"docs":{},"对":{"docs":{},"外":{"docs":{},"分":{"docs":{},"享":{"docs":{},",":{"docs":{},"感":{"docs":{},"兴":{"docs":{},"趣":{"docs":{},"的":{"docs":{},"朋":{"docs":{},"友":{"docs":{},"可":{"docs":{},"以":{"docs":{},"度":{"docs":{},"娘":{"docs":{},"一":{"docs":{},"下":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"两":{"docs":{},"个":{"docs":{},"情":{"docs":{},"况":{"docs":{},",":{"docs":{},"第":{"docs":{},"一":{"docs":{},"个":{"docs":{},"好":{"docs":{},"理":{"docs":{},"解":{"docs":{},",":{"docs":{},"但":{"docs":{},"是":{"docs":{},"第":{"docs":{},"二":{"docs":{},"个":{"docs":{},"初":{"docs":{},"看":{"docs":{},"起":{"docs":{},"来":{"docs":{},"是":{"docs":{},"有":{"docs":{},"瑕":{"docs":{},"疵":{"docs":{},"的":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"个":{"docs":{},"函":{"docs":{},"数":{"docs":{},"做":{"docs":{},"了":{"docs":{},"三":{"docs":{},"件":{"docs":{},"事":{"docs":{},"情":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}},"疑":{"docs":{},"问":{"docs":{},"我":{"docs":{},"们":{"docs":{},"先":{"docs":{},"放":{"docs":{},"一":{"docs":{},"放":{"docs":{},",":{"docs":{},"后":{"docs":{},"面":{"docs":{},"再":{"docs":{},"分":{"docs":{},"析":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}},"类":{"docs":{},"的":{"docs":{},"主":{"docs":{},"要":{"docs":{},"是":{"docs":{},"作":{"docs":{},"为":{"docs":{},"入":{"docs":{},"口":{"docs":{},",":{"docs":{},"负":{"docs":{},"责":{"docs":{},"管":{"docs":{},"理":{"docs":{},"页":{"docs":{},"面":{"docs":{},"路":{"docs":{},"由":{"docs":{},"信":{"docs":{},"息":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}},"里":{"docs":{},"有":{"docs":{},"两":{"docs":{},"个":{"docs":{},"细":{"docs":{},"节":{"docs":{},"指":{"docs":{},"的":{"docs":{},"注":{"docs":{},"意":{"docs":{},",":{"docs":{},"分":{"docs":{},"别":{"docs":{},"是":{"docs":{},"两":{"docs":{},"个":{"docs":{},"断":{"docs":{},"言":{"docs":{},"处":{"docs":{},"理":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}},"些":{"docs":{},"概":{"docs":{},"念":{"docs":{},"虽":{"docs":{},"然":{"docs":{},"不":{"docs":{},"难":{"docs":{},"理":{"docs":{},"解":{"docs":{},",":{"docs":{},"但":{"docs":{},"是":{"docs":{},"甚":{"docs":{},"至":{"docs":{},"比":{"docs":{},"原":{"docs":{},"生":{"docs":{},"还":{"docs":{},"冗":{"docs":{},"杂":{"docs":{},"&":{"docs":{},"#":{"docs":{},"x":{"1":{"docs":{},"f":{"6":{"0":{"2":{"docs":{},";":{"docs":{},"。":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}},"针":{"docs":{},"对":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{},"x":{"docs":{},"的":{"docs":{},"兼":{"docs":{},"容":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"依":{"docs":{},"赖":{"docs":{},"另":{"docs":{},"一":{"docs":{},"个":{"docs":{},"分":{"docs":{},"支":{"docs":{},"。":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}},"消":{"docs":{},"息":{"docs":{},"类":{"docs":{},"的":{"docs":{},",":{"docs":{},"无":{"docs":{},"论":{"docs":{},"是":{"docs":{},"收":{"docs":{},"还":{"docs":{},"是":{"docs":{},"发":{"docs":{},",":{"docs":{},"都":{"docs":{},"约":{"docs":{},"定":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"固":{"docs":{},"定":{"docs":{},"的":{"docs":{},"字":{"docs":{},"符":{"docs":{},"串":{"docs":{},"作":{"docs":{},"为":{"docs":{},"事":{"docs":{},"件":{"docs":{},"名":{"docs":{},"_":{"docs":{},"_":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"_":{"docs":{},"_":{"docs":{},"。":{"docs":{},"对":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"侧":{"docs":{},"发":{"docs":{},"来":{"docs":{},"的":{"docs":{},"消":{"docs":{},"息":{"docs":{},"的":{"docs":{},"识":{"docs":{},"别":{"docs":{},"和":{"docs":{},"监":{"docs":{},"听":{"docs":{},",":{"docs":{},"事":{"docs":{},"件":{"docs":{},"的":{"docs":{},"名":{"docs":{},"字":{"docs":{},"固":{"docs":{},"定":{"docs":{},"为":{"docs":{},"_":{"docs":{},"_":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"_":{"docs":{},"_":{"docs":{},"。":{"docs":{},"其":{"docs":{},"他":{"docs":{},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"事":{"docs":{},"件":{"docs":{},"全":{"docs":{},"部":{"docs":{},"进":{"docs":{},"行":{"docs":{},"转":{"docs":{},"发":{"docs":{},",":{"docs":{},"当":{"docs":{},"做":{"docs":{},"普":{"docs":{},"通":{"docs":{},"方":{"docs":{},"法":{"docs":{},",":{"docs":{},"有":{"docs":{},"外":{"docs":{},"部":{"docs":{},"进":{"docs":{},"行":{"docs":{},"注":{"docs":{},"册":{"docs":{},"监":{"docs":{},"听":{"docs":{},"。":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"闲":{"docs":{},"鱼":{"docs":{},"作":{"docs":{},"为":{"docs":{},"国":{"docs":{},"内":{"docs":{},"较":{"docs":{},"早":{"docs":{},"研":{"docs":{},"究":{"docs":{},",":{"docs":{},"并":{"docs":{},"大":{"docs":{},"规":{"docs":{},"模":{"docs":{},"进":{"docs":{},"行":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"落":{"docs":{},"地":{"docs":{},"的":{"docs":{},"团":{"docs":{},"队":{"docs":{},",":{"docs":{},"开":{"docs":{},"源":{"docs":{},"了":{"docs":{},"他":{"docs":{},"们":{"docs":{},"自":{"docs":{},"研":{"docs":{},"的":{"docs":{},"混":{"docs":{},"合":{"docs":{},"开":{"docs":{},"发":{"docs":{},"框":{"docs":{},"架":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"除":{"docs":{},"了":{"docs":{},"通":{"docs":{},"过":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"地":{"docs":{},"址":{"docs":{},"配":{"docs":{},"置":{"docs":{},"依":{"docs":{},"赖":{"docs":{},",":{"docs":{},"更":{"docs":{},"常":{"docs":{},"见":{"docs":{},"的":{"docs":{},"做":{"docs":{},"法":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"p":{"docs":{},"u":{"docs":{},"b":{"docs":{},"发":{"docs":{},"布":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"引":{"docs":{},"用":{"docs":{},"对":{"docs":{},"应":{"docs":{},"版":{"docs":{},"本":{"docs":{},"即":{"docs":{},"可":{"docs":{},"。":{"docs":{},"关":{"docs":{},"于":{"docs":{},"更":{"docs":{},"多":{"docs":{},"的":{"docs":{},"y":{"docs":{},"a":{"docs":{},"m":{"docs":{},"l":{"docs":{},"依":{"docs":{},"赖":{"docs":{},"规":{"docs":{},"则":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"参":{"docs":{},"考":{"docs":{},"这":{"docs":{},"篇":{"docs":{},"说":{"docs":{},"明":{"docs":{},"文":{"docs":{},"档":{"docs":{},":":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"集":{"docs":{},"成":{"docs":{},"请":{"docs":{},"看":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"boost-how-to.html":{"ref":"boost-how-to.html","tf":0.003289473684210526}}}}}}}}}}}}}}}}}},"其":{"docs":{},"实":{"docs":{},"就":{"docs":{},"是":{"docs":{},"对":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"的":{"docs":{},"使":{"docs":{},"用":{"docs":{},",":{"docs":{},"基":{"docs":{},"本":{"docs":{},"可":{"docs":{},"以":{"docs":{},"认":{"docs":{},"为":{"docs":{},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"东":{"docs":{},"西":{"docs":{},"的":{"docs":{},"两":{"docs":{},"种":{"docs":{},"表":{"docs":{},"述":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"中":{"docs":{},"包":{"docs":{},"含":{"docs":{},"一":{"docs":{},"个":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{},"最":{"docs":{},"终":{"docs":{},"会":{"docs":{},"透":{"docs":{},"传":{"docs":{},"给":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"的":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"属":{"docs":{},"性":{"docs":{},",":{"docs":{},"从":{"docs":{},"而":{"docs":{},"实":{"docs":{},"现":{"docs":{},"了":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"的":{"docs":{},"绑":{"docs":{},"定":{"docs":{},"。":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"配":{"docs":{},"置":{"docs":{},"在":{"docs":{},"有":{"docs":{},"页":{"docs":{},"面":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},"动":{"docs":{},"态":{"docs":{},"生":{"docs":{},"成":{"docs":{},",":{"docs":{},"由":{"docs":{},"函":{"docs":{},"数":{"docs":{},"_":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},"负":{"docs":{},"责":{"docs":{},"。":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"他":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"参":{"docs":{},"考":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}},"名":{"docs":{},"词":{"docs":{},"多":{"docs":{},"!":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}},"很":{"docs":{},"多":{"docs":{},"啊":{"docs":{},"!":{"docs":{},"!":{"docs":{},"!":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}},"!":{"docs":{},"!":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}},"后":{"docs":{},"来":{"docs":{},"看":{"docs":{},"到":{"docs":{},"作":{"docs":{},"者":{"docs":{},"又":{"docs":{},"说":{"docs":{},"了":{"docs":{},"句":{"docs":{},":":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}},"坦":{"docs":{},"白":{"docs":{},"说":{"docs":{},",":{"docs":{},"第":{"docs":{},"一":{"docs":{},"次":{"docs":{},"看":{"docs":{},"到":{"docs":{},"这":{"docs":{},"张":{"docs":{},"图":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},",":{"docs":{},"有":{"docs":{},"几":{"docs":{},"个":{"docs":{},"感":{"docs":{},"觉":{"docs":{},":":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}},"已":{"docs":{},"开":{"docs":{},"源":{"docs":{},"|":{"docs":{},"码":{"docs":{},"上":{"docs":{},"用":{"docs":{},"它":{"docs":{},"开":{"docs":{},"始":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"混":{"docs":{},"合":{"docs":{},"开":{"docs":{},"发":{"docs":{},"—":{"docs":{},"—":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"当":{"docs":{},"我":{"docs":{},"们":{"docs":{},"把":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"架":{"docs":{},"构":{"docs":{},"简":{"docs":{},"化":{"docs":{},"后":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"把":{"docs":{},"目":{"docs":{},"光":{"docs":{},"放":{"docs":{},"到":{"docs":{},"重":{"docs":{},"点":{"docs":{},"上":{"docs":{},"面":{"docs":{},",":{"docs":{},"其":{"docs":{},"他":{"docs":{},"的":{"docs":{},"枝":{"docs":{},"叶":{"docs":{},"如":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"前":{"docs":{},"显":{"docs":{},"示":{"docs":{},"页":{"docs":{},"面":{"docs":{},"已":{"docs":{},"经":{"docs":{},"是":{"docs":{},"需":{"docs":{},"要":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},",":{"docs":{},"规":{"docs":{},"避":{"docs":{},"一":{"docs":{},"个":{"docs":{},"页":{"docs":{},"面":{"docs":{},"i":{"docs":{},"d":{"docs":{},"多":{"docs":{},"次":{"docs":{},"调":{"docs":{},"用":{"docs":{},"入":{"docs":{},"栈":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"发":{"docs":{},"出":{"docs":{},"页":{"docs":{},"面":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"出":{"docs":{},"栈":{"docs":{},"时":{"docs":{},",":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"节":{"docs":{},"点":{"docs":{},"所":{"docs":{},"代":{"docs":{},"表":{"docs":{},"的":{"docs":{},"的":{"docs":{},"数":{"docs":{},"组":{"docs":{},"元":{"docs":{},"素":{"docs":{},"会":{"docs":{},"增":{"docs":{},"加":{"docs":{},"。":{"docs":{},"新":{"docs":{},"增":{"docs":{},"加":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"会":{"docs":{},"插":{"docs":{},"入":{"docs":{},"到":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"数":{"docs":{},"组":{"docs":{},"的":{"docs":{},"第":{"docs":{},"一":{"docs":{},"个":{"docs":{},",":{"docs":{},"形":{"docs":{},"式":{"docs":{},"上":{"docs":{},"就":{"docs":{},"是":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"的":{"docs":{},"效":{"docs":{},"果":{"docs":{},":":{"docs":{},"先":{"docs":{},"进":{"docs":{},"后":{"docs":{},"出":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"生":{"docs":{},"页":{"docs":{},"面":{"docs":{},"切":{"docs":{},"换":{"docs":{},"时":{"docs":{},",":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"内":{"docs":{},"部":{"docs":{},"通":{"docs":{},"过":{"docs":{},"其":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"的":{"docs":{},"顶":{"docs":{},"层":{"docs":{},"入":{"docs":{},"口":{"docs":{},",":{"docs":{},"将":{"docs":{},"所":{"docs":{},"有":{"docs":{},"子":{"docs":{},"页":{"docs":{},"面":{"docs":{},"都":{"docs":{},"进":{"docs":{},"行":{"docs":{},"了":{"docs":{},"一":{"docs":{},"次":{"docs":{},"包":{"docs":{},"裹":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"这":{"docs":{},"些":{"docs":{},"完":{"docs":{},"成":{"docs":{},"后":{"docs":{},"打":{"docs":{},"印":{"docs":{},"一":{"docs":{},"行":{"docs":{},"日":{"docs":{},"志":{"docs":{},",":{"docs":{},"标":{"docs":{},"志":{"docs":{},"着":{"docs":{},"一":{"docs":{},"次":{"docs":{},"页":{"docs":{},"面":{"docs":{},"切":{"docs":{},"换":{"docs":{},"动":{"docs":{},"作":{"docs":{},"完":{"docs":{},"成":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}},"我":{"docs":{},"们":{"docs":{},"想":{"docs":{},"做":{"docs":{},"到":{"docs":{},"把":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"容":{"docs":{},"器":{"docs":{},"做":{"docs":{},"成":{"docs":{},"浏":{"docs":{},"览":{"docs":{},"器":{"docs":{},"的":{"docs":{},"感":{"docs":{},"觉":{"docs":{},"。":{"docs":{},"填":{"docs":{},"写":{"docs":{},"一":{"docs":{},"个":{"docs":{},"页":{"docs":{},"面":{"docs":{},"地":{"docs":{},"址":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"由":{"docs":{},"容":{"docs":{},"器":{"docs":{},"去":{"docs":{},"管":{"docs":{},"理":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"绘":{"docs":{},"制":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},",":{"docs":{},"会":{"docs":{},"基":{"docs":{},"于":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},"进":{"docs":{},"行":{"docs":{},"前":{"docs":{},"置":{"docs":{},"校":{"docs":{},"验":{"docs":{},",":{"docs":{},"通":{"docs":{},"过":{"docs":{},"后":{"docs":{},",":{"docs":{},"则":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"对":{"docs":{},"应":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"的":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"函":{"docs":{},"数":{"docs":{},",":{"docs":{},"进":{"docs":{},"行":{"docs":{},"页":{"docs":{},"面":{"docs":{},"切":{"docs":{},"换":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"既":{"docs":{},"然":{"docs":{},"是":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"开":{"docs":{},"发":{"docs":{},"框":{"docs":{},"架":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"首":{"docs":{},"先":{"docs":{},"要":{"docs":{},"知":{"docs":{},"道":{"docs":{},"的":{"docs":{},"就":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"进":{"docs":{},"行":{"docs":{},"业":{"docs":{},"务":{"docs":{},"开":{"docs":{},"发":{"docs":{},"时":{"docs":{},",":{"docs":{},"他":{"docs":{},"的":{"docs":{},"整":{"docs":{},"体":{"docs":{},"技":{"docs":{},"术":{"docs":{},"架":{"docs":{},"构":{"docs":{},"是":{"docs":{},"怎":{"docs":{},"么":{"docs":{},"样":{"docs":{},"的":{"docs":{},"。":{"docs":{},"除":{"docs":{},"了":{"docs":{},"闲":{"docs":{},"鱼":{"docs":{},"团":{"docs":{},"队":{"docs":{},"的":{"docs":{},"宣":{"docs":{},"讲":{"docs":{},"文":{"docs":{},"章":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"还":{"docs":{},"需":{"docs":{},"深":{"docs":{},"入":{"docs":{},"到":{"docs":{},"代":{"docs":{},"码":{"docs":{},"内":{"docs":{},"部":{"docs":{},"去":{"docs":{},"了":{"docs":{},"解":{"docs":{},"一":{"docs":{},"些":{"docs":{},"新":{"docs":{},"的":{"docs":{},"概":{"docs":{},"念":{"docs":{},".":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"容":{"docs":{},"器":{"docs":{},"调":{"docs":{},"度":{"docs":{},",":{"docs":{},"那":{"docs":{},"么":{"docs":{},"调":{"docs":{},"度":{"docs":{},"员":{"docs":{},"第":{"docs":{},"一":{"docs":{},"步":{"docs":{},"要":{"docs":{},"做":{"docs":{},"的":{"docs":{},"是":{"docs":{},"什":{"docs":{},"么":{"docs":{},"呢":{"docs":{},"?":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}},"现":{"docs":{},"在":{"docs":{},"我":{"docs":{},"们":{"docs":{},"通":{"docs":{},"过":{"docs":{},"几":{"docs":{},"个":{"docs":{},"问":{"docs":{},"答":{"docs":{},"来":{"docs":{},"阐":{"docs":{},"述":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"中":{"docs":{},"核":{"docs":{},"心":{"docs":{},"内":{"docs":{},"容":{"docs":{},":":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}},"又":{"docs":{},"新":{"docs":{},"增":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"疑":{"docs":{},"问":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}},"继":{"docs":{},"续":{"docs":{},"回":{"docs":{},"到":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"上":{"docs":{},"下":{"docs":{},"文":{"docs":{},",":{"docs":{},"分":{"docs":{},"析":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"函":{"docs":{},"数":{"docs":{},"实":{"docs":{},"现":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"理":{"docs":{},"解":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"新":{"docs":{},"概":{"docs":{},"念":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}},"瞬":{"docs":{},"间":{"docs":{},"感":{"docs":{},"觉":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"高":{"docs":{},"度":{"docs":{},"被":{"docs":{},"原":{"docs":{},"地":{"docs":{},"干":{"docs":{},"拔":{"docs":{},"起":{"docs":{},"来":{"docs":{},"了":{"docs":{},",":{"docs":{},"这":{"docs":{},"是":{"docs":{},"要":{"docs":{},"和":{"docs":{},"v":{"8":{"docs":{},"引":{"docs":{},"擎":{"docs":{},"比":{"docs":{},"肩":{"docs":{},"么":{"docs":{},"&":{"docs":{},"#":{"docs":{},"x":{"1":{"docs":{},"f":{"6":{"3":{"6":{"docs":{},";":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}}}}}}}}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}},"问":{"docs":{},"题":{"1":{"docs":{},":":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"是":{"docs":{},"工":{"docs":{},"具":{"docs":{},"类":{"docs":{},"还":{"docs":{},"是":{"docs":{},"什":{"docs":{},"么":{"docs":{},",":{"docs":{},"他":{"docs":{},"的":{"docs":{},"具":{"docs":{},"体":{"docs":{},"代":{"docs":{},"表":{"docs":{},"了":{"docs":{},"什":{"docs":{},"么":{"docs":{},"?":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"加":{"docs":{},"上":{"docs":{},"目":{"docs":{},"标":{"docs":{},"页":{"docs":{},"面":{"docs":{},"已":{"docs":{},"经":{"docs":{},"存":{"docs":{},"在":{"docs":{},"于":{"docs":{},"后":{"docs":{},"台":{"docs":{},"队":{"docs":{},"列":{"docs":{},",":{"docs":{},"那":{"docs":{},"么":{"docs":{},"如":{"docs":{},"果":{"docs":{},"要":{"docs":{},"显":{"docs":{},"示":{"docs":{},",":{"docs":{},"是":{"docs":{},"不":{"docs":{},"是":{"docs":{},"应":{"docs":{},"该":{"docs":{},"把":{"docs":{},"他":{"docs":{},"前":{"docs":{},"面":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"全":{"docs":{},"部":{"docs":{},"出":{"docs":{},"栈":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"将":{"docs":{},"他":{"docs":{},"显":{"docs":{},"示":{"docs":{},"出":{"docs":{},"来":{"docs":{},"?":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"2":{"docs":{},":":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"和":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"f":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"的":{"docs":{},"区":{"docs":{},"别":{"docs":{},"是":{"docs":{},"什":{"docs":{},"么":{"docs":{},"?":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"入":{"docs":{},"栈":{"docs":{},"函":{"docs":{},"数":{"docs":{},"调":{"docs":{},"用":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"(":{"docs":{},"{":{"docs":{},"}":{"docs":{},")":{"docs":{},"触":{"docs":{},"发":{"docs":{},"了":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"刷":{"docs":{},"新":{"docs":{},",":{"docs":{},"但":{"docs":{},"是":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"函":{"docs":{},"数":{"docs":{},"内":{"docs":{},"的":{"docs":{},"依":{"docs":{},"赖":{"docs":{},"关":{"docs":{},"系":{"docs":{},"并":{"docs":{},"没":{"docs":{},"有":{"docs":{},"被":{"docs":{},"改":{"docs":{},"变":{"docs":{},",":{"docs":{},"如":{"docs":{},"何":{"docs":{},"刷":{"docs":{},"新":{"docs":{},"?":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"3":{"docs":{},":":{"docs":{},"m":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"和":{"docs":{},"c":{"docs":{},"o":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"本":{"docs":{},"质":{"docs":{},"是":{"docs":{},"什":{"docs":{},"么":{"docs":{},"?":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"屏":{"docs":{},"蔽":{"docs":{},"了":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"的":{"docs":{},"s":{"docs":{},"u":{"docs":{},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},"之":{"docs":{},"后":{"docs":{},",":{"docs":{},"没":{"docs":{},"有":{"docs":{},"副":{"docs":{},"作":{"docs":{},"用":{"docs":{},"吗":{"docs":{},"?":{"docs":{},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"如":{"docs":{},"何":{"docs":{},"进":{"docs":{},"行":{"docs":{},"待":{"docs":{},"刷":{"docs":{},"新":{"docs":{},"标":{"docs":{},"记":{"docs":{},"?":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}},"首":{"docs":{},"先":{"docs":{},"我":{"docs":{},"们":{"docs":{},"一":{"docs":{},"起":{"docs":{},"看":{"docs":{},"一":{"docs":{},"下":{"docs":{},"整":{"docs":{},"个":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"架":{"docs":{},"构":{"docs":{},"关":{"docs":{},"系":{"docs":{},"。":{"docs":{"boost-architecture.html":{"ref":"boost-architecture.html","tf":0.02631578947368421}}}}}}}}}}}}}}}}}}}}}}}},"!":{"docs":{},"=":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.023529411764705882},"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.01485148514851485},"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}},"\"":{"docs":{},"w":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}},"_":{"docs":{},"_":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"_":{"docs":{},"_":{"docs":{},"\"":{"docs":{},")":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}},"$":{"docs":{},"{":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},".":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"}":{"docs":{},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}},".":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"o":{"docs":{},"f":{"docs":{},"(":{"docs":{},")":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"l":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}},".":{"docs":{},".":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.027932960893854747}}}},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},"(":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},",":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}},"?":{"docs":{},".":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"_":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"s":{"docs":{},"(":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},",":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"?":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"@":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"i":{"docs":{},"d":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.011764705882352941},"boost-container.html":{"ref":"boost-container.html","tf":0.0111731843575419}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196}}}}}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"g":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00784313725490196},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"以":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"中":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"为":{"docs":{},"例":{"docs":{},",":{"docs":{},"当":{"docs":{},"我":{"docs":{},"们":{"docs":{},"点":{"docs":{},"击":{"docs":{},"打":{"docs":{},"开":{"docs":{},"第":{"docs":{},"二":{"docs":{},"个":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"页":{"docs":{},"面":{"docs":{},"后":{"docs":{},",":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"节":{"docs":{},"点":{"docs":{},"中":{"docs":{},"插":{"docs":{},"入":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"再":{"docs":{},"次":{"docs":{},"通":{"docs":{},"过":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"将":{"docs":{},"页":{"docs":{},"面":{"docs":{},"展":{"docs":{},"示":{"docs":{},"实":{"docs":{},"践":{"docs":{},"回":{"docs":{},"传":{"docs":{},"给":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},",":{"docs":{},"事":{"docs":{},"件":{"docs":{},"名":{"docs":{},"为":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{},"e":{"docs":{},"d":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"出":{"docs":{},"栈":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},"到":{"docs":{},"这":{"docs":{},"里":{"docs":{},",":{"docs":{},"不":{"docs":{},"知":{"docs":{},"道":{"docs":{},"你":{"docs":{},"有":{"docs":{},"没":{"docs":{},"有":{"docs":{},"疑":{"docs":{},"问":{"docs":{},",":{"docs":{},"反":{"docs":{},"正":{"docs":{},"我":{"docs":{},"是":{"docs":{},"有":{"docs":{},"的":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}},"只":{"docs":{},"有":{"docs":{},"当":{"docs":{},"整":{"docs":{},"个":{"docs":{},"条":{"docs":{},"件":{"docs":{},"满":{"docs":{},"足":{"docs":{},"时":{"docs":{},"才":{"docs":{},"会":{"docs":{},"触":{"docs":{},"发":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"操":{"docs":{},"作":{"docs":{},",":{"docs":{},"整":{"docs":{},"个":{"docs":{},"条":{"docs":{},"件":{"docs":{},"会":{"docs":{},"屏":{"docs":{},"蔽":{"docs":{},"两":{"docs":{},"种":{"docs":{},"尝":{"docs":{},"试":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"情":{"docs":{},"况":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},"他":{"docs":{},"定":{"docs":{},"义":{"docs":{},"了":{"docs":{},"针":{"docs":{},"对":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"四":{"docs":{},"种":{"docs":{},"操":{"docs":{},"作":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}},"与":{"docs":{},"原":{"docs":{},"生":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"非":{"docs":{},"常":{"docs":{},"类":{"docs":{},"似":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"仅":{"docs":{},"仅":{"docs":{},"是":{"docs":{},"传":{"docs":{},"入":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"键":{"docs":{},"值":{"docs":{},"对":{"docs":{},"的":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},"。":{"docs":{},"其":{"docs":{},"中":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"是":{"docs":{},"页":{"docs":{},"面":{"docs":{},"路":{"docs":{},"由":{"docs":{},"的":{"docs":{},"么":{"docs":{},"名":{"docs":{},"字":{"docs":{},",":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"其":{"docs":{},"实":{"docs":{},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{},"类":{"docs":{},"似":{"docs":{},"于":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"。":{"docs":{},"差":{"docs":{},"异":{"docs":{},"在":{"docs":{},"于":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"额":{"docs":{},"外":{"docs":{},"封":{"docs":{},"装":{"docs":{},"了":{"docs":{},"一":{"docs":{},"些":{"docs":{},"容":{"docs":{},"器":{"docs":{},"维":{"docs":{},"度":{"docs":{},"的":{"docs":{},"属":{"docs":{},"性":{"docs":{},",":{"docs":{},"比":{"docs":{},"如":{"docs":{},"说":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"唯":{"docs":{},"一":{"docs":{},"标":{"docs":{},"识":{"docs":{},",":{"docs":{},"参":{"docs":{},"数":{"docs":{},"等":{"docs":{},"。":{"docs":{},"所":{"docs":{},"以":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"可":{"docs":{},"以":{"docs":{},"简":{"docs":{},"单":{"docs":{},"理":{"docs":{},"解":{"docs":{},"为":{"docs":{},"就":{"docs":{},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"个":{"docs":{},"性":{"docs":{},"化":{"docs":{},"的":{"docs":{},"专":{"docs":{},"用":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"。":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"预":{"docs":{},"见":{"docs":{},"的":{"docs":{},"时":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"调":{"docs":{},"用":{"docs":{},"的":{"docs":{},"o":{"docs":{},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"操":{"docs":{},"作":{"docs":{},"最":{"docs":{},"终":{"docs":{},"也":{"docs":{},"会":{"docs":{},"通":{"docs":{},"过":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{},"再":{"docs":{},"次":{"docs":{},"从":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"侧":{"docs":{},"回":{"docs":{},"到":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},",":{"docs":{},"并":{"docs":{},"修":{"docs":{},"改":{"docs":{},"数":{"docs":{},"组":{"docs":{},"元":{"docs":{},"素":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"同":{"docs":{},"镇":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"数":{"docs":{},"据":{"docs":{},"变":{"docs":{},"更":{"docs":{},",":{"docs":{},"同":{"docs":{},"时":{"docs":{},"触":{"docs":{},"发":{"docs":{},"观":{"docs":{},"察":{"docs":{},"者":{"docs":{},"回":{"docs":{},"调":{"docs":{},"函":{"docs":{},"数":{"docs":{},"的":{"docs":{},"执":{"docs":{},"行":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"外":{"docs":{},"层":{"docs":{},"包":{"docs":{},"裹":{"docs":{},"的":{"docs":{},"节":{"docs":{},"点":{"docs":{},"分":{"docs":{},"别":{"docs":{},"是":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"侧":{"docs":{},"实":{"docs":{},"现":{"docs":{},"位":{"docs":{},"于":{"docs":{},"函":{"docs":{},"数":{"docs":{},":":{"docs":{},"_":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"w":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},"的":{"docs":{},"拦":{"docs":{},"截":{"docs":{},"和":{"docs":{},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},"不":{"docs":{},"同":{"docs":{},",":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},"拦":{"docs":{},"截":{"docs":{},"只":{"docs":{},"增":{"docs":{},"加":{"docs":{},"了":{"docs":{},"对":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"的":{"docs":{},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"和":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"修":{"docs":{},"饰":{"docs":{},",":{"docs":{},"最":{"docs":{},"终":{"docs":{},"还":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"调":{"docs":{},"用":{"docs":{},"s":{"docs":{},"u":{"docs":{},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{},"交":{"docs":{},"给":{"docs":{},"了":{"docs":{},"原":{"docs":{},"生":{"docs":{},"的":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"处":{"docs":{},"理":{"docs":{},"。":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"将":{"docs":{},"当":{"docs":{},"前":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"加":{"docs":{},"入":{"docs":{},"o":{"docs":{},"f":{"docs":{},"f":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"列":{"docs":{},"表":{"docs":{},"中":{"docs":{},",":{"docs":{},"重":{"docs":{},"新":{"docs":{},"生":{"docs":{},"成":{"docs":{},"新":{"docs":{},"的":{"docs":{},"目":{"docs":{},"标":{"docs":{},"页":{"docs":{},"面":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"整":{"docs":{},"个":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"构":{"docs":{},"建":{"docs":{},"非":{"docs":{},"常":{"docs":{},"简":{"docs":{},"单":{"docs":{},",":{"docs":{},"就":{"docs":{},"是":{"docs":{},"利":{"docs":{},"用":{"docs":{},"了":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"组":{"docs":{},"件":{"docs":{},",":{"docs":{},"实":{"docs":{},"现":{"docs":{},"了":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"层":{"docs":{},"叠":{"docs":{},"。":{"docs":{},"这":{"docs":{},"样":{"docs":{},"每":{"docs":{},"一":{"docs":{},"层":{"docs":{},"自":{"docs":{},"身":{"docs":{},"还":{"docs":{},"可":{"docs":{},"以":{"docs":{},"使":{"docs":{},"用":{"docs":{},"原":{"docs":{},"生":{"docs":{},"的":{"docs":{},"路":{"docs":{},"由":{"docs":{},"栈":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"容":{"docs":{},"器":{"docs":{},",":{"docs":{},"涉":{"docs":{},"及":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"和":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{},"在":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"中":{"docs":{},"继":{"docs":{},"承":{"docs":{},"关":{"docs":{},"系":{"docs":{},"如":{"docs":{},"下":{"docs":{},":":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"最":{"docs":{},"后":{"docs":{},"一":{"docs":{},"个":{"docs":{},"动":{"docs":{},"作":{"docs":{},"的":{"docs":{},"作":{"docs":{},"用":{"docs":{},"有":{"docs":{},"两":{"docs":{},"个":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}},"执":{"docs":{},"行":{"docs":{},"传":{"docs":{},"入":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"的":{"docs":{},"{":{"docs":{},"}":{"docs":{},"函":{"docs":{},"数":{"docs":{},"。":{"docs":{},"所":{"docs":{},"以":{"docs":{},"说":{"docs":{},"对":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},"就":{"docs":{},"是":{"docs":{},"在":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},"中":{"docs":{},"进":{"docs":{},"行":{"docs":{},"的":{"docs":{},"。":{"docs":{},"这":{"docs":{},"里":{"docs":{},"还":{"docs":{},"有":{"docs":{},"一":{"docs":{},"个":{"docs":{},"注":{"docs":{},"意":{"docs":{},"点":{"docs":{},",":{"docs":{},"重":{"docs":{},"载":{"docs":{},"的":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"屏":{"docs":{},"蔽":{"docs":{},"了":{"docs":{},"s":{"docs":{},"u":{"docs":{},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},"函":{"docs":{},"数":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"更":{"docs":{},"新":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"并":{"docs":{},"且":{"docs":{},"添":{"docs":{},"加":{"docs":{},"下":{"docs":{},"一":{"docs":{},"帧":{"docs":{},"刷":{"docs":{},"新":{"docs":{},"函":{"docs":{},"数":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"构":{"docs":{},"造":{"docs":{},"新":{"docs":{},"的":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"数":{"docs":{},"组":{"docs":{},",":{"docs":{},"并":{"docs":{},"且":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},"转":{"docs":{},"换":{"docs":{},"为":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"检":{"docs":{},"索":{"docs":{},"一":{"docs":{},"下":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"的":{"docs":{},"上":{"docs":{},"下":{"docs":{},"文":{"docs":{},",":{"docs":{},"答":{"docs":{},"案":{"docs":{},"很":{"docs":{},"快":{"docs":{},"就":{"docs":{},"揭":{"docs":{},"晓":{"docs":{},"了":{"docs":{},":":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"函":{"docs":{},"数":{"docs":{},"被":{"docs":{},"重":{"docs":{},"载":{"docs":{},"了":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"目":{"docs":{},"标":{"docs":{},"页":{"docs":{},"面":{"docs":{},"处":{"docs":{},"于":{"docs":{},"o":{"docs":{},"f":{"docs":{},"f":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"队":{"docs":{},"列":{"docs":{},"中":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"要":{"docs":{},"显":{"docs":{},"示":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"已":{"docs":{},"经":{"docs":{},"在":{"docs":{},"后":{"docs":{},"台":{"docs":{},"队":{"docs":{},"列":{"docs":{},"中":{"docs":{},",":{"docs":{},"则":{"docs":{},"忽":{"docs":{},"略":{"docs":{},"当":{"docs":{},"次":{"docs":{},"入":{"docs":{},"栈":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"前":{"docs":{},"支":{"docs":{},"持":{"docs":{},"的":{"docs":{},"核":{"docs":{},"心":{"docs":{},"方":{"docs":{},"法":{"docs":{},"包":{"docs":{},"括":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}},"移":{"docs":{},"除":{"docs":{},"现":{"docs":{},"有":{"docs":{},"的":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"节":{"docs":{},"点":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}},"(":{"docs":{},"这":{"docs":{},"个":{"docs":{},"和":{"docs":{},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},"的":{"docs":{},"区":{"docs":{},"别":{"docs":{},"后":{"docs":{},"面":{"docs":{},"分":{"docs":{},"析":{"docs":{},")":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}},"第":{"docs":{},"二":{"docs":{},"个":{"docs":{},"刷":{"docs":{},"新":{"docs":{},"焦":{"docs":{},"点":{"docs":{},",":{"docs":{},"原":{"docs":{},"因":{"docs":{},"是":{"docs":{},"这":{"docs":{},"里":{"docs":{},"每":{"docs":{},"个":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"其":{"docs":{},"实":{"docs":{},"都":{"docs":{},"有":{"docs":{},"一":{"docs":{},"个":{"docs":{},"原":{"docs":{},"生":{"docs":{},"的":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},";":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}},"还":{"docs":{},"记":{"docs":{},"得":{"docs":{},"前":{"docs":{},"面":{"docs":{},"我":{"docs":{},"们":{"docs":{},"打":{"docs":{},"印":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"栈":{"docs":{},"切":{"docs":{},"换":{"docs":{},"是":{"docs":{},"的":{"docs":{},"日":{"docs":{},"志":{"docs":{},"么":{"docs":{},",":{"docs":{},"答":{"docs":{},"案":{"docs":{},"就":{"docs":{},"在":{"docs":{},"其":{"docs":{},"中":{"docs":{},"。":{"docs":{},"我":{"docs":{},"们":{"docs":{},"搜":{"docs":{},"索":{"docs":{},"一":{"docs":{},"下":{"docs":{},"w":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"这":{"docs":{},"个":{"docs":{},"定":{"docs":{},"义":{"docs":{},"好":{"docs":{},"的":{"docs":{},"方":{"docs":{},"法":{"docs":{},"名":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"找":{"docs":{},"到":{"docs":{},"蛛":{"docs":{},"丝":{"docs":{},"马":{"docs":{},"迹":{"docs":{},":":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"需":{"docs":{},"要":{"docs":{},"验":{"docs":{},"证":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{},"代":{"docs":{},"码":{"docs":{},"是":{"docs":{},"否":{"docs":{},"也":{"docs":{},"可":{"docs":{},"以":{"docs":{},"移":{"docs":{},"到":{"docs":{},"这":{"docs":{},"里":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}},"页":{"docs":{},"面":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"实":{"docs":{},"现":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}},"合":{"docs":{},"法":{"docs":{},"性":{"docs":{},"校":{"docs":{},"验":{"docs":{},",":{"docs":{},"基":{"docs":{},"于":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"唯":{"docs":{},"一":{"docs":{},"标":{"docs":{},"识":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"i":{"docs":{},"d":{"docs":{},",":{"docs":{},"作":{"docs":{},"用":{"docs":{},"是":{"docs":{},"防":{"docs":{},"止":{"docs":{},"重":{"docs":{},"复":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"。":{"docs":{},"可":{"docs":{},"以":{"docs":{},"结":{"docs":{},"合":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"方":{"docs":{},"法":{"docs":{},"。":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"后":{"docs":{},"台":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}},"栈":{"docs":{},"刷":{"docs":{},"新":{"docs":{},"逻":{"docs":{},"辑":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"绑":{"docs":{},"定":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}},"容":{"docs":{},"器":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"类":{"docs":{},"是":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"。":{"docs":{},"类":{"docs":{},"似":{"docs":{},"的":{"docs":{},",":{"docs":{},"他":{"docs":{},"也":{"docs":{},"新":{"docs":{},"增":{"docs":{},"了":{"docs":{},"一":{"docs":{},"些":{"docs":{},"状":{"docs":{},"态":{"docs":{},"的":{"docs":{},"概":{"docs":{},"念":{"docs":{},":":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"视":{"docs":{},"图":{"docs":{},"管":{"docs":{},"理":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":10}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"实":{"docs":{},"现":{"docs":{},"栈":{"docs":{},"操":{"docs":{},"作":{"docs":{},"页":{"docs":{},"面":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"绑":{"docs":{},"定":{"docs":{},"其":{"docs":{},"他":{"docs":{},"页":{"docs":{},"面":{"docs":{},"容":{"docs":{},"器":{"docs":{},"的":{"docs":{},"视":{"docs":{},"图":{"docs":{},"管":{"docs":{},"理":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"消":{"docs":{},"失":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"销":{"docs":{},"毁":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"路":{"docs":{},"由":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"与":{"docs":{},"差":{"docs":{},"异":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":10}},"路":{"docs":{},"由":{"docs":{},"绑":{"docs":{},"定":{"docs":{},"页":{"docs":{},"面":{"docs":{},"配":{"docs":{},"置":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"事":{"docs":{},"件":{"docs":{},"定":{"docs":{},"义":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"方":{"docs":{},"法":{"docs":{},"定":{"docs":{},"义":{"docs":{},"页":{"docs":{},"面":{"docs":{},"路":{"docs":{},"由":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"与":{"docs":{},"差":{"docs":{},"异":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"进":{"docs":{},"入":{"docs":{},"前":{"docs":{},"台":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}},"后":{"docs":{},"台":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"配":{"docs":{},"置":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}},"顶":{"docs":{},"层":{"docs":{},"容":{"docs":{},"器":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}},"栈":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":10}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"视":{"docs":{},"图":{"docs":{},"栈":{"docs":{},"顶":{"docs":{},"层":{"docs":{},"容":{"docs":{},"器":{"docs":{"boost-container-manager.html":{"ref":"boost-container-manager.html","tf":0.00392156862745098}}}}}}}}}}}}}}}}}}}}}},"&":{"docs":{},"&":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095},"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}},"即":{"docs":{},"将":{"docs":{},"消":{"docs":{},"失":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}},"处":{"docs":{},"理":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"出":{"docs":{},"栈":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"相":{"docs":{},"关":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},",":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"中":{"docs":{},"还":{"docs":{},"添":{"docs":{},"加":{"docs":{},"了":{"docs":{},"一":{"docs":{},"些":{"docs":{},"对":{"docs":{},"栈":{"docs":{},"状":{"docs":{},"态":{"docs":{},"的":{"docs":{},"监":{"docs":{},"听":{"docs":{},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"是":{"docs":{},"添":{"docs":{},"加":{"docs":{},"监":{"docs":{},"听":{"docs":{},"器":{"docs":{},"和":{"docs":{},"循":{"docs":{},"环":{"docs":{},"遍":{"docs":{},"历":{"docs":{},",":{"docs":{},"这":{"docs":{},"里":{"docs":{},"不":{"docs":{},"再":{"docs":{},"展":{"docs":{},"开":{"docs":{},",":{"docs":{},"相":{"docs":{},"关":{"docs":{},"接":{"docs":{},"口":{"docs":{},"为":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"。":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"展":{"docs":{},"示":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"总":{"docs":{},"的":{"docs":{},"来":{"docs":{},"说":{"docs":{},"就":{"docs":{},"是":{"docs":{},"出":{"docs":{},"栈":{"docs":{},"需":{"docs":{},"要":{"docs":{},"考":{"docs":{},"虑":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"自":{"docs":{},"身":{"docs":{},"已":{"docs":{},"经":{"docs":{},"由":{"docs":{},"n":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"控":{"docs":{},"制":{"docs":{},"的":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{},"这":{"docs":{},"一":{"docs":{},"次":{"docs":{},"页":{"docs":{},"面":{"docs":{},"容":{"docs":{},"器":{"docs":{},",":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"则":{"docs":{},"是":{"docs":{},"使":{"docs":{},"用":{"docs":{},"原":{"docs":{},"生":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"。":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"栈":{"docs":{},"操":{"docs":{},"作":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}},"继":{"docs":{},"承":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.01675977653631285}},"自":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}},"置":{"docs":{},"前":{"docs":{},"台":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}},"后":{"docs":{},"台":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}},"重":{"docs":{},"载":{"docs":{},"了":{"docs":{},"p":{"docs":{},"u":{"docs":{},"s":{"docs":{},"h":{"docs":{},",":{"docs":{},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},",":{"docs":{},"m":{"docs":{},"a":{"docs":{},"y":{"docs":{},"b":{"docs":{},"e":{"docs":{},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},"等":{"docs":{},"函":{"docs":{},"数":{"docs":{},",":{"docs":{},"提":{"docs":{},"供":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"返":{"docs":{},"回":{"docs":{},"键":{"docs":{},"函":{"docs":{},"数":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{},"新":{"docs":{},"增":{"docs":{},"了":{"docs":{},"观":{"docs":{},"察":{"docs":{},"者":{"docs":{},"的":{"docs":{},"注":{"docs":{},"册":{"docs":{},"接":{"docs":{},"口":{"docs":{"boost-container.html":{"ref":"boost-container.html","tf":0.00558659217877095}}}}}}}}}}}}}},"]":{"docs":{},",":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}},"事":{"docs":{},"件":{"docs":{},"的":{"docs":{},"定":{"docs":{},"义":{"docs":{},"目":{"docs":{},"前":{"docs":{},"内":{"docs":{},"置":{"docs":{},"了":{"4":{"docs":{},"种":{"docs":{},",":{"docs":{},"分":{"docs":{},"别":{"docs":{},"是":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}},"docs":{}}}}}}}}}}},"几":{"docs":{},"乎":{"docs":{},"都":{"docs":{},"是":{"docs":{},"围":{"docs":{},"绕":{"docs":{},"着":{"docs":{},"两":{"docs":{},"个":{"docs":{},"页":{"docs":{},"面":{"docs":{},"切":{"docs":{},"换":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},"的":{"docs":{},"状":{"docs":{},"态":{"docs":{},"进":{"docs":{},"行":{"docs":{},"的":{"docs":{},"定":{"docs":{},"义":{"docs":{},"。":{"docs":{},"有":{"docs":{},"一":{"docs":{},"个":{"docs":{},"需":{"docs":{},"要":{"docs":{},"注":{"docs":{},"意":{"docs":{},"就":{"docs":{},"是":{"docs":{},"针":{"docs":{},"对":{"docs":{},"页":{"docs":{},"面":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"的":{"docs":{},"两":{"docs":{},"个":{"docs":{},"事":{"docs":{},"件":{"docs":{},"处":{"docs":{},"理":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"前":{"docs":{},"后":{"docs":{},"台":{"docs":{},"事":{"docs":{},"件":{"docs":{},"触":{"docs":{},"发":{"docs":{},"后":{"docs":{},",":{"docs":{},"会":{"docs":{},"对":{"docs":{},"当":{"docs":{},"前":{"docs":{},"状":{"docs":{},"态":{"docs":{},"进":{"docs":{},"行":{"docs":{},"标":{"docs":{},"记":{"docs":{},",":{"docs":{},"具":{"docs":{},"体":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"单":{"docs":{},"例":{"docs":{},",":{"docs":{},"获":{"docs":{},"取":{"docs":{},"的":{"docs":{},"当":{"docs":{},"前":{"docs":{},"的":{"docs":{},"目":{"docs":{},"标":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"容":{"docs":{},"器":{"docs":{},";":{"docs":{},"最":{"docs":{},"后":{"docs":{},"通":{"docs":{},"知":{"docs":{},"观":{"docs":{},"察":{"docs":{},"者":{"docs":{},"。":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"有":{"docs":{},"了":{"docs":{},"路":{"docs":{},"由":{"docs":{},"表":{"docs":{},"以":{"docs":{},"后":{"docs":{},",":{"docs":{},"比":{"docs":{},"那":{"docs":{},"可":{"docs":{},"以":{"docs":{},"在":{"docs":{},"合":{"docs":{},"适":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},"调":{"docs":{},"用":{"docs":{},",":{"docs":{},"从":{"docs":{},"路":{"docs":{},"由":{"docs":{},"表":{"docs":{},"中":{"docs":{},"获":{"docs":{},"取":{"docs":{},"目":{"docs":{},"标":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"构":{"docs":{},"建":{"docs":{},"出":{"docs":{},"一":{"docs":{},"个":{"docs":{},"真":{"docs":{},"正":{"docs":{},"的":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"页":{"docs":{},"面":{"docs":{},"。":{"docs":{},"这":{"docs":{},"一":{"docs":{},"步":{"docs":{},"又":{"docs":{},"是":{"docs":{},"怎":{"docs":{},"么":{"docs":{},"实":{"docs":{},"现":{"docs":{},"的":{"docs":{},"呢":{"docs":{},"?":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"自":{"docs":{},"然":{"docs":{},"是":{"docs":{},"先":{"docs":{},"要":{"docs":{},"有":{"docs":{},"可":{"docs":{},"以":{"docs":{},"被":{"docs":{},"灵":{"docs":{},"活":{"docs":{},"调":{"docs":{},"度":{"docs":{},"的":{"docs":{},"容":{"docs":{},"器":{"docs":{},"。":{"docs":{},"因":{"docs":{},"此":{"docs":{},",":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"第":{"docs":{},"一":{"docs":{},"步":{"docs":{},"就":{"docs":{},"是":{"docs":{},"先":{"docs":{},"进":{"docs":{},"行":{"docs":{},"路":{"docs":{},"由":{"docs":{},"的":{"docs":{},"注":{"docs":{},"册":{"docs":{},"配":{"docs":{},"置":{"docs":{},"。":{"docs":{},"当":{"docs":{},"我":{"docs":{},"们":{"docs":{},"执":{"docs":{},"行":{"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"时":{"docs":{},",":{"docs":{},"它":{"docs":{},"的":{"docs":{},"具":{"docs":{},"体":{"docs":{},"实":{"docs":{},"现":{"docs":{},"如":{"docs":{},"下":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"调":{"docs":{},"度":{"docs":{},"一":{"docs":{},"次":{"docs":{},"页":{"docs":{},"面":{"docs":{},"绘":{"docs":{},"制":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}},"返":{"docs":{},"回":{"docs":{},"事":{"docs":{},"件":{"docs":{},"的":{"docs":{},"处":{"docs":{},"理":{"docs":{},"则":{"docs":{},"会":{"docs":{},"分":{"docs":{},"发":{"docs":{},"至":{"docs":{},"当":{"docs":{},"前":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{},"触":{"docs":{},"发":{"docs":{},"一":{"docs":{},"次":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},"动":{"docs":{},"作":{"docs":{},"。":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"键":{"docs":{},"事":{"docs":{},"件":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}},"进":{"docs":{},"一":{"docs":{},"步":{"docs":{},"的":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"继":{"docs":{},"续":{"docs":{},"分":{"docs":{},"析":{"docs":{},"下":{"docs":{},",":{"docs":{},"这":{"docs":{},"个":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"什":{"docs":{},"么":{"docs":{},"时":{"docs":{},"候":{"docs":{},"会":{"docs":{},"被":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"触":{"docs":{},"发":{"docs":{},"呢":{"docs":{},"?":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"通":{"docs":{},"过":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},",":{"docs":{},"将":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"个":{"docs":{},"性":{"docs":{},"化":{"docs":{},"页":{"docs":{},"面":{"docs":{},"创":{"docs":{},"建":{"docs":{},"最":{"docs":{},"终":{"docs":{},"与":{"docs":{},"n":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"关":{"docs":{},"联":{"docs":{},"了":{"docs":{},"起":{"docs":{},"来":{"docs":{},"。":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"配":{"docs":{},"置":{"docs":{},"的":{"docs":{},"生":{"docs":{},"成":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"如":{"docs":{},"下":{"docs":{},",":{"docs":{},"当":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"被":{"docs":{},"f":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"触":{"docs":{},"发":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},",":{"docs":{},"将":{"docs":{},"构":{"docs":{},"建":{"docs":{},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"的":{"docs":{},"任":{"docs":{},"务":{"docs":{},"委":{"docs":{},"托":{"docs":{},"给":{"docs":{},"了":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"处":{"docs":{},"理":{"docs":{},":":{"docs":{"boost-router.html":{"ref":"boost-router.html","tf":0.0049504950495049506}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"发":{"docs":{},"消":{"docs":{},"息":{"docs":{},"包":{"docs":{},"括":{"docs":{},"事":{"docs":{},"件":{"docs":{},"的":{"docs":{},"消":{"docs":{},"息":{"docs":{},"两":{"docs":{},"类":{"docs":{},",":{"docs":{},"分":{"docs":{},"别":{"docs":{},"是":{"docs":{},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"和":{"docs":{},"i":{"docs":{},"n":{"docs":{},"v":{"docs":{},"o":{"docs":{},"k":{"docs":{},"e":{"docs":{},"x":{"docs":{},"x":{"docs":{},"x":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"h":{"docs":{},"d":{"docs":{},"。":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"基":{"docs":{},"础":{"docs":{},"消":{"docs":{},"息":{"docs":{},"通":{"docs":{},"道":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}},"方":{"docs":{},"法":{"docs":{},"通":{"docs":{},"道":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}},"流":{"docs":{},"式":{"docs":{},"通":{"docs":{},"道":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}},"由":{"docs":{},"于":{"docs":{},"通":{"docs":{},"道":{"docs":{},"本":{"docs":{},"身":{"docs":{},"是":{"docs":{},"有":{"docs":{},"开":{"docs":{},"销":{"docs":{},"的":{"docs":{},",":{"docs":{},"在":{"docs":{},"整":{"docs":{},"个":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"中":{"docs":{},"只":{"docs":{},"有":{"docs":{},"这":{"docs":{},"一":{"docs":{},"个":{"docs":{},"通":{"docs":{},"道":{"docs":{},",":{"docs":{},"他":{"docs":{},"作":{"docs":{},"为":{"docs":{},"全":{"docs":{},"局":{"docs":{},"单":{"docs":{},"例":{"docs":{},"被":{"docs":{},"共":{"docs":{},"享":{"docs":{},"。":{"docs":{},"我":{"docs":{},"们":{"docs":{},"前":{"docs":{},"文":{"docs":{},"汇":{"docs":{},"总":{"docs":{},"分":{"docs":{},"析":{"docs":{},"到":{"docs":{},"的":{"docs":{},"页":{"docs":{},"面":{"docs":{},"的":{"docs":{},"事":{"docs":{},"件":{"docs":{},"传":{"docs":{},"递":{"docs":{},",":{"docs":{},"和":{"docs":{},"页":{"docs":{},"面":{"docs":{},"入":{"docs":{},"栈":{"docs":{},"操":{"docs":{},"作":{"docs":{},"这":{"docs":{},"些":{"docs":{},"都":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"这":{"docs":{},"一":{"docs":{},"个":{"docs":{},"通":{"docs":{},"道":{"docs":{},"来":{"docs":{},"完":{"docs":{},"成":{"docs":{},"的":{"docs":{},"。":{"docs":{"method-channel.html":{"ref":"method-channel.html","tf":0.01282051282051282}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"length":751},"corpusTokens":["!=","\"__event__\")","\"willshowpagecontainer\":","##","${call.method}\");","&&","'/')","'0.1.61'","'default',","'feature/flutter_1.9_androidx_upgrade'","'first':","'flutter","'flutterfragment':","'flutterpage':","'https://github.com/alibaba/flutter_boost.git'","'openpage',","'platformview':","'second':","'tab':","(_pagebuilders[name]","(boostcontainerobserv","(buildcontext","(call.method","(canpop())","(e)","(eventlisten","(flutterboost.containermanager?.containscontainer(pageid)","(list","(page","(pagename,","(platform.isios)","(routeset","(routesettings.nam","(schedul","(schedulerbinding.instance.schedulerphas","(t",");","...",".close(uniqueid,",".observersof())",".singleton.observershold","//","///","///regist","///可以在native层通过","//build","//return","//todo,","//tri","03","20","2020","23","24","=","==","=>",">0/tab",">2/second","?.pushcontainer(_createcontainersettings(name,","??","@overrid","[","[],","[debug]","[schedulerbinding.handledrawframe].","[widgetsbinding.addpersistentframecallback])","[widgetsbinding.drawframe]","[xdebug]","],","_)","_createcontainersettings(","_defaultpagebuild","_defaultpagebuilder(name,","_eventlisteners[name];","_methodchannel","_methodchannel.setmethodcallhandler((methodcal","_methodhandlers)","_nativecontainerwillshow(pagename,","_nativecontainerwillshow(str","_offstage.add(_onstage);","_onmethodcall(methodcal","_onroutepushed),","_onstag","_onstage.settings);","_onstage.settings.uniqueid);","_overlaykey,","_pagebuilders[name](name,","_refreshoverlayentries();","add","animated:","api","api扩展小结boost接入吹水","appear","app,还是选boost好,小孩子才做选择😅。","arg","arg);","assert(_offstage.every((boostcontain","assert(false,","assert(pag","assert(settings.uniqueid","background","backpressedcallback","basicmessagechannel","bool","boost","boost_channel.dart","boost_container.dart","boostcontain","boostcontainer(","boostcontainer.obtain(","boostcontainer.obtain(widget.initnavigator,","boostcontainermanag","boostcontainermanager视图栈的实现页面入栈实现页面栈刷新逻辑顶层容器栈的实现","boostcontainerset","boostcontainersettings(","boostcontainerst","boostcontainer实现","boostpageroute(","boost。该项目自开源后,社区热度不断攀升,目前在github上的❤已经达到3.5k。","boost事件定义","boost作为一款flutter插件,它遵循官方的接入标准,首先在pubspec.yaml中添加对应依赖:","boost全双工通道","boost全双工通道boost通信通道boost全双工通道","boost接入吹水","boost接入吹水yaml配置boost","boost整体架构分析","boost整体架构分析flutt","boost方法定义","boost本身作为一个flutter插件,他的核心逻辑分为三部分,分别是dart侧的使用api和andorid、ios端上的容器支持。鉴于boost的混合思想,其重度依赖自定义的混合栈调用来实现页面的切换。","boost本身在native侧也有比较强的定制逻辑,需要大量初始化逻辑,无法只通过generatedpluginregistrant完成。","boost架构","boost架构理解boost的新概念小结boost整体架构分析","boost核心原理","boost核心原理》阅读之旅吧。","boost核心原理关于作者flutt","boost的实现原理和核心点,希望对flutter开发者更好地掌握混合开发有所增益。","boost的版本为","boost视图栈","boost通信通道","boost集成","boost,不做区分;","break;","build","build(buildcontext","build/layout/paint","builder","builder.","builder:","builder;","builders)","call)","call){","call.arguments[\"arguments\"];","call.arguments[\"name\"];","call.arguments[\"pagename\"];","call.arguments[\"params\"];","call.arguments[\"uniqueid\"];","callback","case","catch","chang","channel","channel.invokemethod>(","class","conatiner_coordinator.dart","const","contain","container(),","container)","container.settings.uniqueid","container:second","container:tab","container_coordinator.dart","container_cordinator.dart","containercoordinator.singleton.registerpagebuilders(builders);","containernavigatorobserv","containernavigatorobserver.bindcontainermanager()","containerobserver#2","container就是一个普通的widget,直接继承了原生navigator,用于承载页面widget。可以认为他是用了替换原生的navigator的。","containn","context)","ctx)","current","dart侧的多视图栈管理","dart侧页面切换操作","dart初始化配置","dart配置","dart配置boost","dealloc,","default","destroy","diddisappearpagecontain","didinitpagecontain","didonstag","didpush","didpush');","didremov","didshowpagecontain","dipose时销毁观察者和历史路由页面","disappear","dump:","duration)","e.tostring());","eventchannel","example',","executing.","extend","exts;","exts}){","factori","false,","false;","final","firstroutewidget(),","flutter","flutter:","flutter_boost.dart","flutter_boost:","flutterboost","flutterboost#boostcontainerlifecycleobserv","flutterboost#build","flutterboost#containerobserver#2","flutterboost#managernavigatorobserv","flutterboost#n","flutterboost#onmetohdcal","flutterboost#onshowncontainerchang","flutterboost.containermanag","flutterboost.init(postpush:","flutterboost.singleton","flutterboost.singleton.close(uniqueid);","flutterboost.singleton.open(\"second\");","flutterboost.singleton.registerpagebuilders({","flutterroutewidget(params:params);","fn();","fn)","for(methodhandl","foreground","fragmentroutewidget(params),","futur","future.value();","future;","future>","generatedpluginregistrant的字段注册逻辑只是完成通道注册,这是插件与native通信的核心;","getcontainerparam","git:","gitbook最近更新","globalkey(),","handler","handler(call);","home:","https://dart.dev/tools/pub/depend","https://flutter.dev/docs/development/platform","https://github.com/alibaba/flutter_boost","init","initialentries:","integration/platform","key","key:","l","l(name,","lifecycle:containerlifecycle.appear","lifecycle:containerlifecycle.destroy","lifecycle:containerlifecycle.disappear","lifecycle:containerlifecycle.init","lifecycle:containerlifecycle.willdisappear","list","list)","logger.log(\"onmetohdcal","logger.log('build","logger.log('containerobserver#2","manag","manager是flutter容器的管理,提供show,remove等api。它本身也是一个widget,通过对外暴露state,提供了api操作。这个widget内部管理了一个overlay组件,从而实现了多视图栈的管理。","map","map();","map)","map);","materialapp(","methodchannel","methodchannel(\"flutter_boost\");","name","name,","name:","name;","native初始化配置和原因","native层的引擎复用处理","native配置","native配置boost","navig","navigator,","navigator.ongenerateroute(routesettings);","navigator.onunknownroute);","navigatorobserv","navigatorst","new","newroute;","now:0","now:2","null","null)","null);","observ","observer(containeroperation.push,","observers:","offstage#:","old:0","old:2","old:nul","ongenerateroute:","onnativepageresult","onstag","onstage#:","onunknownroute:","open(str","optionalmethodchannel","overlay","overlay(","owner","owner?.rootsemanticsnode;","page","page:$name($pageid)');","page:second(2)","page;","pageid)","pageid));","pageid);","pageid,","pagenam","pagename:","pagestack","param","params,","params:","params:$params\");","params;","persist","persistentcallbacks,","pipeline.","platformroutewidget(),","pop","pop([t","pop拦截后,如果当前存在原生的navigator视图栈,则优先弹出,如果不存在,则通过channel转发给了native;","power","print(\"flutterpag","properti","properties);","properties[\"exts\"]","properties[\"url\"]","properties[\"urlparams\"]","ps:这个小专栏呢,我们不打算探讨到是选官方的add","push","push(rout","pushcontainer(boostcontainerset","ref:","registerpagebuilders(map","remov","reset","result","result:","result])","return","root","root?.attach(owner);","root?.detach();","rout","route)","route);","routerhistory.add(route);","routeset","routesettings)","routesettings,","routesettings;","schedulefram","schedulerbinding.instance.addpostframecallback((dur","schedulerphase.persistentcallbacks)","secondroutewidget(),","see","semanticsnod","semanticsown","setstate(()","setstate(voidcallback","settings)","settings);","settings,","settings.builder);","settings.name,","settings.params,","settings.uniqueid));","settings.uniqueid,","settings:","show,","string","super.pop(result);","super.push(newrout","super.setstate(fn);","surfac","tabroutewidget(),","this.builder});","this.nam","this.params,","title:","tri","true","true)","true;","typically,","uid/nam","uniqueid","uniqueid);","uniqueid:","uniqueid;","url,{map","url:","url;","urlparams,map","urlparams;","us","v0.1.61;","view,route,channel等,并不是boost独有的。对boost的源码分析将在后续章节逐一介绍。","void","widget","widget:$pag","widget:secondroutewidget","widgetbuild","widgetsbinding.instance.pipelineowner?.semanticsowner;","willdeallocpagecontain","willdisappear","willdisappearpagecontain","willshowpagecontain","willshow在源码中不会通知其自定义的生命周期回调,didshow会通知。除此之外,两者的实现中都有对页码创建。为什么会存在这种逻辑,目前单纯分析dart侧代码得不到解释,后续在分析native源码时可以进一步确认相关调用链路。","yaml配置","yaml集成方式","{","{this.uniqueid","{uniqueid=0,name=tab}","{uniqueid=2,name=second}","{uniqueid=default,name=default}","{});","}","});","},","}else{","下面我们通过一张图,来概括boostchannel所做的事情:","下面我再结合boost里面的一些新名词,理解他们的实际含义和作用。","下面是以ios为例,输出的页面状态变化日志:","为了让boost更接地气,我决定把我对源码的理解,重新画一张low图,让boost落到地上,避免开发者被整张架构图给\"劝退\"了。(这里不是吐槽原图,也不代表原图表达有何不当之处)","为什么dart侧页面切换要通过native侧?","事件的定义目前内置了4种,分别是:","从事android开发多年的码农一枚,就职于58同城,负责58app的相关研发工作。","从其提供的能力来看,主要是为了从native角度,封装出页面的生命周期事件。我们知道有状态的widget本身只有initstate和dispose事件,当页面更新时触发didupdatewidget。","从源码解读flutter","以example中的页面为例,当我们点击打开第二个flutter页面后,widget节点中插入了一个secondroutewidget。","但是这里针对boost,是需要一些操作的,主要原因有两点:","入口配置","入栈","全文boost均指代flutt","关于作者","其中包含一个builder,最终会透传给navigator的builder属性,从而实现了widget的绑定。setting配置在有页面push的时候动态生成,由函数_createcontainersettings负责。","其他","其实就是对methochannel的使用,基本可以认为是一个东西的两种表述。","再次通过channel将页面展示实践回传给native,事件名为onshowncontainerchanged;","几乎都是围绕着两个页面切换过程中的状态进行的定义。有一个需要注意就是针对页面show的两个事件处理:","出栈","初始化","到这里,不知道你有没有疑问,反正我是有的。","前后台事件触发后,会对当前状态进行标记,具体是通过boost单例,获取的当前的目标container容器;最后通知观察者。","即将消失","参考","发消息包括事件的消息两类,分别是sendevent和invokexxxmetohd。","只有当整个条件满足时才会触发入栈操作,整个条件会屏蔽两种尝试入栈的情况:","可以看到与原生route非常类似,我们仅仅是传入了一个键值对的map。其中key是页面路由的么名字,value其实是一个builder,类似于widgetbuilder。差异在于boost额外封装了一些容器维度的属性,比如说页面的唯一标识,参数等。所以pagebuilder可以简单理解为就是一个个性化的专用widgetbuilder。","可以看到他定义了针对页面的四种操作:","可以预见的时,我们调用的open操作最终也会通过channel再次从native侧回到dart侧,并修改数组元素。","同镇state数据变更,同时触发观察者回调函数的执行。","名词多!","名词很多啊!!!","名词很多!!","后来看到作者又说了句:","在boost里面通信的场景主要是定义双方的页面栈操作和相关联的事件消息,它使用的是methodchannel","在container中,我们没有看到build重载,上下文中,也不涉及页面构建逻辑。回顾下我们前面分析的嵌套关系图","在flutter与native通信过程中,框架本身提供了一套channel机制,方便开发者进行数据的双向读写。","在flutter中,根据不同的使用场景channel可以进一步细分,目前提供的有:","在flutter中,经常通过widgetbuilder来实现视图的按需构建。这里boost定义了一个页面配置的模型。","在《顶层容器栈的实现》一节中,我们通过检索路由表被调用的逻辑,知道当dart侧收到页面创建事件willshowpagecontainer时,回去实例化一个页面。实例化页面的时候,根据事件的参数,构造了一个页面维度的配置,叫做boostcontainersettings,配置中的widgetbuilder是用和原生路由配合工作的。","在使用boost过程中,我们可以观测到很多标签日志输出,如果要查方法相关的日志,可以过滤关键词onmetohdcall。","在修改overlay的过程中,主要分几步:","在前面的页面分析过程中,多次提到了channel通道的使用。这块通道逻辑都在container_coordinator.dart中,coordinator有调度员的意思,这大概就是路由管理封装类命名的原因吧。","在开始之前,我们做一下约定:","在我们画的那张图中,隐去了关于路由的几个元素和箭头,同时我们把新的名词换为了原生名词。","在执行入栈pushcontainer函数前有一个判断:flutterboost.containermanager?.containscontainer(pageid)","在整个boost里面他的核心有两个:","在源码中,定义了一个boostchannel的操作类,内部封装了methodchannel的使用。它定义了两大类操作,收消息和发消息。","在自定义的页面容器中,主要重载的是路由的相关出栈、入栈操作。","坦白说,第一次看到这张图的时候,有几个感觉:","基础消息通道","处理页面的出栈入栈相关逻辑,boostcontainer中还添加了一些对栈状态的监听,主要是添加监听器和循环遍历,这里不再展开,相关接口为containernavigatorobserver。","外层包裹的节点分别是:","如果当前flutter正在进程绘制调度,那么将刷新动作延迟加入下一次绘制的回调函数中。根据api注释,可以知道当persisntcallback代表build/layout/paint之一正在被执行","如果您已经充分了解如何使用boost,可以选择性的快速跳过本节。下面我们一步步先把boost集成进来。","如果读者对channel的使用不慎了解,可以参考通道的使用文档,写的比较清楚:","完成初始化配置后,可以按需同api进去页面的切换。页面管理的核心在于native侧,dart侧需要切换页面时通过静态通道发起事件:","对push的拦截和pop不同,push拦截只增加了对route的pre和post修饰,最终还是通过调用super,交给了原生的navigator处理。","对应的dart侧实现位于函数:_nativecontainerwillshow。","将当前的页面加入offstage列表中,重新生成新的目标页面。","小结","展示","已开源|码上用它开始flutter混合开发——flutterboost","开发flutter的小伙伴应该都知道,目前社区内开源且比较成熟的混合框架非常少。","当widget","当前显示页面已经是需要入栈的页面,规避一个页面id多次调用入栈","当发出页面入栈出栈时,overlay节点所代表的的数组元素会增加。新增加的页面会插入到overlay数组的第一个,形式上就是stack的效果:先进后出。","当发生页面切换时,boost内部通过其自定义的顶层入口,将所有子页面都进行了一次包裹。","当我们把boost架构简化后,可以把目光放到重点上面,其他的枝叶如flutt","当这些完成后打印一行日志,标志着一次页面切换动作完成:","总的来说就是出栈需要考虑navigator自身已经由native控制的overlay这一次页面容器,入栈则是使用原生navigator逻辑。","我们可以看到,会基于页面的pageid进行前置校验,通过后,则会调用manager对应state的pushcontainer函数,进行页面切换。","我们想做到把flutter容器做成浏览器的感觉。填写一个页面地址,然后由容器去管理页面的绘制。","扩展","接下来既可以开始使用boost了,如果你查看项目介绍会发现,文档建设上面还是有提高空间的,在readme.md中对接入的介绍只有一句话🙃:","整个manager的页面构建非常简单,就是利用了overlay组件,实现了页面的层叠。这样每一层自身还可以使用原生的路由栈。","整个navigator容器,涉及widget,state和observer,在boost中继承关系如下:","方法通道","既然是flutter开发框架,我们首先要知道的就是通过boost进行业务开发时,他的整体技术架构是怎么样的。除了闲鱼团队的宣讲文章,我们还需深入到代码内部去了解一些新的概念.","既然是容器调度,那么调度员第一步要做的是什么呢?","最后一个动作的作用有两个:","最后执行传入setstate的{}函数。所以说对overlay的操作就是在_refreshoverlayentries中进行的。这里还有一个注意点,重载的setstate屏蔽了super函数。","最后更新overlaystate并且添加下一帧刷新函数","有了路由表以后,比那可以在合适的时候调用,从路由表中获取目标页面的pagebuilder,然后构建出一个真正的widget页面。这一步又是怎么实现的呢?","本系列文章谢绝转载,内容为私有原创,如有转载需求请联系作者chaobinwu89@gmail.com,并保留出处。","来传递参数","构造新的boostconatiner数组,并且map转换为overlayentri","栈操作","检索一下manager的上下文,答案很快就揭晓了:setstate函数被重载了。","正常来说修改稿state一定是在{}中改变的状态属性,并且该属性会被build直接、间接引用,才能达到刷新目的。","正常来说,一个标准flutter插件不应该要求flutter开发者,过多的手工去修改native配置,绝大部分的flutter插件会通过自动生成的generatedpluginregistrant完成插件注册逻辑。","流式通道","添加完依赖库后,可以进行相应的初始化配置。这里配置主要有两块,分别是如有初始化和入口配置。","现在我们又新增了一个疑问:","现在我们继续回到manager上下文,分析对应的函数实现。","现在我们通过几个问答来阐述boost的中核心内容:","理解boost的新概念","由于通道本身是有开销的,在整个boost中只有这一个通道,他作为全局单例被共享。我们前文汇总分析到的页面的事件传递,和页面入栈操作这些都是通过这一个通道来完成的。","目前支持的核心方法包括:","目标页面处于offstage队列中,如果要显示的页面已经在后台队列中,则忽略当次入栈","瞬间感觉boost高度被原地干拔起来了,这是要和v8引擎比肩么😶。","移除现有的overlay节点","移除(这个和pop的区别后面分析)","第二个刷新焦点,原因是这里每个overlayentry其实都有一个原生的navigator;","简介","简单来说是在navigator中触发的。我们已经知道boostcontainer本身继承了navigator,所以它是被当做navigator来使用的。在构建boostcontainer时,构造器如下:","简答归纳就是切换时,新页面的出现和当前页面的消失状态,最后还dump除了最终视图栈情况。","类似的,当调用close,页面视图栈发生变化,也有对应状态切换。","继承","继承自methodchannel","置前台","置后台","自然是先要有可以被灵活调度的容器。因此,boost使用的第一步就是先进行路由的注册配置。当我们执行registerpagebuilders时,它的具体实现如下:","视图栈的实现","调度一次页面绘制","路由绑定","路由配置","返回事件的处理则会分发至当前container,触发一次页面的pop动作。","返回键事件","还记得前面我们打印的页面栈切换是的日志么,答案就在其中。我们搜索一下willshowpagecontainer这个定义好的方法名,可以找到蛛丝马迹:","这一节中,我们介绍了集成boost的几个关键点:","这一节我们分析页面容器的实现。通过源码对比,可以知道boost参考了flutter内部的navigator实现,进行了相应的调整,更严格的说是继承了navigator。","这一节的标题\"偷用\"了数据通信中的\"双工\"概念,来表示flutter通信的能力。通过在native和dart侧定义channel通道,开发者可以非常简单就实现框架级别的数据交互。这比webview和native直接的通信好用很多,性能也更优,并且不会触发字符串长度问题导致的通信内容截断,有点扯远了。","这两个情况,第一个好理解,但是第二个初看起来是有瑕疵的:","这个函数做了三件事情:","这个疑问我们先放一放,后面再分析。","这个类的主要是作为入口,负责管理页面路由信息。","这些概念虽然不难理解,但是甚至比原生还冗杂😂。","这套方案有不少团队也采纳了,并且还基于这个方案做过对外分享,感兴趣的朋友可以度娘一下。","这里有两个细节指的注意,分别是两个断言处理:","进一步的,我们继续分析下,这个widgetbuilder什么时候会被flutter触发呢?","通过ongenerateroute,将boost的个性化页面创建最终与navigator关联了起来。","那么boost是如何实现的页面绑定关系?","那么究竟boost是如何实现的页面栈的管理?与原生视图的栈的关系又是怎么样的呢?带着这些疑问,开始你的《flutt","那么这个channel对应的方法是什么?","配置的生成逻辑如下,当widgetbuilder被flutter触发的时候,将构建widget的任务委托给了pagebuilder处理:","重载了push,pop,maybepop等函数,提供了一个返回键函数","针对androidx的兼容,需要依赖另一个分支。","针对消息类的,无论是收还是发,都约定了一个固定的字符串作为事件名__event__。对native侧发来的消息的识别和监听,事件的名字固定为__event__。其他类型的事件全部进行转发,当做普通方法,有外部进行注册监听。","问题1:containermanager是工具类还是什么,他的具体代表了什么?","问题1:加上目标页面已经存在于后台队列,那么如果要显示,是不是应该把他前面的页面全部出栈,然后将他显示出来?","问题2:container和statefullwidget,statelesswidget的区别是什么?","问题2:入栈函数调用setstate({})触发了widget刷新,但是build函数内的依赖关系并没有被改变,如何刷新?","问题3:messaging和coordinator本质是什么?","问题3:屏蔽了setstate的super之后,没有副作用吗?element如何进行待刷新标记?","闲鱼作为国内较早研究,并大规模进行flutter落地的团队,开源了他们自研的混合开发框架flutt","除了通过git地址配置依赖,更常见的做法是通过pub发布,然后引用对应版本即可。关于更多的yaml依赖规则,可以参考这篇说明文档:","集成请看boost的exampl","需要验证android代码是否也可以移到这里","页面widget绑定","页面入栈实现","页面合法性校验,基于页面的唯一标识uniqueid,作用是防止重复入栈。可以结合containscontainer方法。","页面后台","页面容器的实现类是boostcontainer。类似的,他也新增了一些状态的概念:","页面容器的视图管理","页面容器的视图管理boostcontainer实现栈操作页面widget绑定其他页面容器的视图管理","页面栈刷新逻辑","页面消失","页面路由的实现与差异","页面路由的实现与差异路由绑定页面配置boost事件定义boost方法定义页面路由的实现与差异","页面进入前台","页面进入后台","页面配置","页面销毁","顶层容器","顶层容器栈的实现","顶层容器栈的实现boost视图栈顶层容器","首先我们一起看一下整个boost的架构关系。",",新增了观察者的注册接口"],"pipeline":["stopWordFilter","stemmer"]},"store":{"./":{"url":"./","title":"简介","keywords":"","body":"Flutter Boost核心原理关于作者Flutter Boost核心原理\n从源码解读Flutter Boost的实现原理和核心点,希望对Flutter开发者更好地掌握混合开发有所增益。\nBoost本身作为一个Flutter插件,他的核心逻辑分为三部分,分别是Dart侧的使用API和Andorid、iOS端上的容器支持。鉴于Boost的混合思想,其重度依赖自定义的混合栈调用来实现页面的切换。\n那么究竟Boost是如何实现的页面栈的管理?与原生视图的栈的关系又是怎么样的呢?带着这些疑问,开始你的《Flutter Boost核心原理》阅读之旅吧。\n关于作者\n从事Android开发多年的码农一枚,就职于58同城,负责58App的相关研发工作。\n\n本系列文章谢绝转载,内容为私有原创,如有转载需求请联系作者chaobinwu89@gmail.com,并保留出处。 \n\npowered by Gitbook最近更新\n2020-03-24\n"},"boost-how-to.html":{"url":"boost-how-to.html","title":"Boost接入吹水","keywords":"","body":"Boost接入吹水Yaml配置Boost Dart配置Boost Native配置Boost API扩展小结Boost接入吹水\n开发Flutter的小伙伴应该都知道,目前社区内开源且比较成熟的混合框架非常少。\n闲鱼作为国内较早研究,并大规模进行Flutter落地的团队,开源了他们自研的混合开发框架Flutter Boost。该项目自开源后,社区热度不断攀升,目前在Github上的❤已经达到3.5K。\n\nhttps://github.com/alibaba/flutter_boost\n\n这套方案有不少团队也采纳了,并且还基于这个方案做过对外分享,感兴趣的朋友可以度娘一下。\n\nPS:这个小专栏呢,我们不打算探讨到是选官方的Add to app,还是选Boost好,小孩子才做选择😅。\n\n在开始之前,我们做一下约定:\n\nBoost的版本为 v0.1.61;\n\n全文Boost均指代Flutter Boost,不做区分;\n\n\n如果您已经充分了解如何使用Boost,可以选择性的快速跳过本节。下面我们一步步先把Boost集成进来。\nYaml配置\nBoost作为一款Flutter插件,它遵循官方的接入标准,首先在pubspec.yaml中添加对应依赖:\nflutter_boost:\n git:\n url: 'https://github.com/alibaba/flutter_boost.git'\n ref: '0.1.61'\n\n针对androidx的兼容,需要依赖另一个分支。\nflutter_boost:\n git:\n url: 'https://github.com/alibaba/flutter_boost.git'\n ref: 'feature/flutter_1.9_androidx_upgrade'\n\n除了通过git地址配置依赖,更常见的做法是通过pub发布,然后引用对应版本即可。关于更多的yaml依赖规则,可以参考这篇说明文档:\n\nhttps://dart.dev/tools/pub/dependencies\n\n接下来既可以开始使用Boost了,如果你查看项目介绍会发现,文档建设上面还是有提高空间的,在README.md中对接入的介绍只有一句话🙃:\n## boost集成\n集成请看boost的Examples\nBoost Dart配置\n添加完依赖库后,可以进行相应的初始化配置。这里配置主要有两块,分别是如有初始化和入口配置。\n\n路由配置\n\nFlutterBoost.singleton.registerPageBuilders({\n 'first': (pageName, params, _) => FirstRouteWidget(),\n 'second': (pageName, params, _) => SecondRouteWidget(),\n 'tab': (pageName, params, _) => TabRouteWidget(),\n 'platformView': (pageName, params, _) => PlatformRouteWidget(),\n 'flutterFragment': (pageName, params, _) => FragmentRouteWidget(params),\n ///可以在native层通过 getContainerParams 来传递参数\n 'flutterPage': (pageName, params, _) {\n print(\"flutterPage params:$params\");\n\n return FlutterRouteWidget(params:params);\n },\n});\n\n\n入口配置\n\nMaterialApp(\n title: 'Flutter Boost example',\n builder: FlutterBoost.init(postPush: _onRoutePushed),\n home: Container(),\n);\n\nBoost Native配置\n正常来说,一个标准Flutter插件不应该要求Flutter开发者,过多的手工去修改Native配置,绝大部分的Flutter插件会通过自动生成的GeneratedPluginRegistrant完成插件注册逻辑。\n但是这里针对Boost,是需要一些操作的,主要原因有两点:\n\nGeneratedPluginRegistrant的字段注册逻辑只是完成通道注册,这是插件与Native通信的核心;\nBoost本身在Native侧也有比较强的定制逻辑,需要大量初始化逻辑,无法只通过GeneratedPluginRegistrant完成。\n\nBoost API\n完成初始化配置后,可以按需同API进去页面的切换。页面管理的核心在于Native侧,Dart侧需要切换页面时通过静态通道发起事件:\nFlutterBoost.singleton.open(\"second\");\n\n/// flutter_boost.dart \nFuture> open(String url,{Map urlParams,Map exts}){\n Map properties = new Map();\n properties[\"url\"] = url;\n properties[\"urlParams\"] = urlParams;\n properties[\"exts\"] = exts;\n return channel.invokeMethod>(\n 'openPage', properties);\n}\n\n扩展\n为什么Dart侧页面切换要通过native侧?\n从其提供的能力来看,主要是为了从Native角度,封装出页面的生命周期事件。我们知道有状态的Widget本身只有initState和dispose事件,当页面更新时触发didUpdateWidget。\n下面是以iOS为例,输出的页面状态变化日志:\n\ndidInitPageContainer => willDisappearPageContainer => willShowPageContainer => didDisappearPageContainer => didShowPageContainer\n\n简答归纳就是切换时,新页面的出现和当前页面的消失状态,最后还dump除了最终视图栈情况。\n[XDEBUG]---surface changed--reset-\nflutter: FlutterBoost#onMetohdCall didInitPageContainer\nflutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.Init\nflutter: FlutterBoost#onMetohdCall willDisappearPageContainer\nflutter: FlutterBoost#BoostContainerLifeCycleObserver container:tab lifeCycle:ContainerLifeCycle.WillDisappear\nflutter: FlutterBoost#onMetohdCall willShowPageContainer\nflutter: FlutterBoost#ContainerObserver#2 didPush\nflutter: FlutterBoost#onMetohdCall didDisappearPageContainer\nflutter: FlutterBoost#BoostContainerLifeCycleObserver container:tab lifeCycle:ContainerLifeCycle.Disappear\n[DEBUG]--ADD--PageStack uid/name-->0/tab-->2/second\nflutter: FlutterBoost#onMetohdCall didShowPageContainer\nflutter: FlutterBoost#onShownContainerChanged old:null now:2\nflutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.Appear\nflutter: FlutterBoost#native containner did show,\nmanager dump:\nonstage#:\n {uniqueId=2,name=second}\noffstage#:\n {uniqueId=0,name=tab}\n {uniqueId=default,name=default}\nflutter: FlutterBoost#ManagerNavigatorObserver didPush\nflutter: FlutterBoost#build widget:SecondRouteWidget for page:second(2)\nflutter: FlutterBoost#onShownContainerChanged old:0 now:2\n类似的,当调用close,页面视图栈发生变化,也有对应状态切换。\nflutter: FlutterBoost#onMetohdCall willDisappearPageContainer\nflutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.WillDisappear\nflutter: FlutterBoost#onMetohdCall willShowPageContainer\nflutter: FlutterBoost#onMetohdCall didDisappearPageContainer\nflutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.Disappear\n[DEBUG]--ADD--PageStack uid/name-->0/tab-->2/second\nflutter: FlutterBoost#onMetohdCall didShowPageContainer\nflutter: FlutterBoost#ContainerObserver#2 didOnstage\nflutter: FlutterBoost#BoostContainerLifeCycleObserver container:tab lifeCycle:ContainerLifeCycle.Appear\nflutter: FlutterBoost#native containner did show,\nmanager dump:\nonstage#:\n {uniqueId=0,name=tab}\noffstage#:\n {uniqueId=2,name=second}\n {uniqueId=default,name=default}\n[DEBUG]--REMOVE--PageStack uid/name-->0/tab\nflutter: FlutterBoost#onShownContainerChanged old:2 now:0\nflutter: FlutterBoost#onMetohdCall willDeallocPageContainer\nflutter: FlutterBoost#BoostContainerLifeCycleObserver container:second lifeCycle:ContainerLifeCycle.Destroy\nflutter: FlutterBoost#ContainerObserver#2 didRemove\nflutter: FlutterBoost#native containner dealloc, \n manager dump:\nonstage#:\n {uniqueId=0,name=tab}\noffstage#:\n {uniqueId=default,name=default}\n小结\n这一节中,我们介绍了集成Boost的几个关键点:\n\nyaml集成方式\nDart初始化配置\nNative初始化配置和原因\nDart侧页面切换操作 \n\npowered by Gitbook最近更新\n2020-03-20\n"},"boost-architecture.html":{"url":"boost-architecture.html","title":"Boost整体架构分析","keywords":"","body":"Boost整体架构分析Flutter Boost架构理解Boost的新概念小结Boost整体架构分析\n既然是Flutter开发框架,我们首先要知道的就是通过Boost进行业务开发时,他的整体技术架构是怎么样的。除了闲鱼团队的宣讲文章,我们还需深入到代码内部去了解一些新的概念.\nFlutter Boost架构\n首先我们一起看一下整个Boost的架构关系。\n\n坦白说,第一次看到这张图的时候,有几个感觉:\n\n名词多!\n名词很多!!\n名词很多啊!!!\n\n\n后来看到作者又说了句:\n\n我们想做到把Flutter容器做成浏览器的感觉。填写一个页面地址,然后由容器去管理页面的绘制。\n\n瞬间感觉Boost高度被原地干拔起来了,这是要和V8引擎比肩么😶。\n为了让Boost更接地气,我决定把我对源码的理解,重新画一张Low图,让Boost落到地上,避免开发者被整张架构图给\"劝退\"了。(这里不是吐槽原图,也不代表原图表达有何不当之处)\n\n在整个Boost里面他的核心有两个:\n\nNative层的引擎复用处理\nDart侧的多视图栈管理\n\n在我们画的那张图中,隐去了关于路由的几个元素和箭头,同时我们把新的名词换为了原生名词。\n下面我再结合Boost里面的一些新名词,理解他们的实际含义和作用。\n理解Boost的新概念\n现在我们通过几个问答来阐述Boost的中核心内容:\n\n问题1:ContainerManager是工具类还是什么,他的具体代表了什么?\n\nContainer Manager是Flutter容器的管理,提供show,remove等Api。它本身也是一个Widget,通过对外暴露State,提供了API操作。这个Widget内部管理了一个Overlay组件,从而实现了多视图栈的管理。\n\n问题2:Container和StatefullWidget,StatelessWidget的区别是什么?\n\nContainer就是一个普通的Widget,直接继承了原生Navigator,用于承载页面Widget。可以认为他是用了替换原生的Navigator的。\n\n问题3:Messaging和Coordinator本质是什么?\n\n其实就是对MethoChannel的使用,基本可以认为是一个东西的两种表述。\n小结\n当我们把Boost架构简化后,可以把目光放到重点上面,其他的枝叶如Flutter View,Route,Channel等,并不是Boost独有的。对Boost的源码分析将在后续章节逐一介绍。\n\n参考\n\n已开源|码上用它开始Flutter混合开发——FlutterBoost\n\npowered by Gitbook最近更新\n2020-03-23\n"},"boost-container-manager.html":{"url":"boost-container-manager.html","title":"顶层容器栈的实现","keywords":"","body":"顶层容器栈的实现Boost视图栈顶层容器 BoostContainerManager视图栈的实现页面入栈实现页面栈刷新逻辑顶层容器栈的实现\nBoost视图栈\n当发生页面切换时,Boost内部通过其自定义的顶层入口,将所有子页面都进行了一次包裹。\n\n外层包裹的节点分别是:\n\nBoostContainerManager => Overlay => BoostContainer\n\n\n当发出页面入栈出栈时,Overlay节点所代表的的数组元素会增加。新增加的页面会插入到Overlay数组的第一个,形式上就是Stack的效果:先进后出。\n\n顶层容器 BoostContainerManager\n这个类的主要是作为入口,负责管理页面路由信息。\n可以看到他定义了针对页面的四种操作:\n\npush 入栈\nonstage 页面后台\npop 出栈\nremove 移除(这个和pop的区别后面分析)\n\n视图栈的实现\n整个Manager的页面构建非常简单,就是利用了Overlay组件,实现了页面的层叠。这样每一层自身还可以使用原生的路由栈。\n@override\nWidget build(BuildContext context) {\n return Overlay(\n key: _overlayKey,\n initialEntries: const [],\n );\n}\n\n可以预见的时,我们调用的open操作最终也会通过channel再次从native侧回到dart侧,并修改数组元素。\n\n那么这个channel对应的方法是什么?\n\n还记得前面我们打印的页面栈切换是的日志么,答案就在其中。我们搜索一下willShowPageContainer这个定义好的方法名,可以找到蛛丝马迹:\n/// container_cordinator.dart\nFuture _onMethodCall(MethodCall call) {\n Logger.log(\"onMetohdCall ${call.method}\");\n case \"willShowPageContainer\":\n {\n String pageName = call.arguments[\"pageName\"];\n Map params = call.arguments[\"params\"];\n String uniqueId = call.arguments[\"uniqueId\"];\n _nativeContainerWillShow(pageName, params, uniqueId);\n }\n break;\n}\nbool _nativeContainerWillShow(String name, Map params, String pageId) {\n if (FlutterBoost.containerManager?.containsContainer(pageId) != true) {\n FlutterBoost.containerManager\n ?.pushContainer(_createContainerSettings(name, params, pageId));\n }\n\n //TODO, 需要验证android代码是否也可以移到这里\n if (Platform.isIOS) {\n try {\n final SemanticsOwner owner =\n WidgetsBinding.instance.pipelineOwner?.semanticsOwner;\n final SemanticsNode root = owner?.rootSemanticsNode;\n root?.detach();\n root?.attach(owner);\n } catch (e) {\n assert(false, e.toString());\n }\n }\n return true;\n}\n\n对应的dart侧实现位于函数:_nativeContainerWillShow。\n我们可以看到,会基于页面的pageid进行前置校验,通过后,则会调用Manager对应State的pushContainer函数,进行页面切换。\n页面入栈实现\n现在我们继续回到Manager上下文,分析对应的函数实现。\nvoid pushContainer(BoostContainerSettings settings) {\n assert(settings.uniqueId != _onstage.settings.uniqueId);\n assert(_offstage.every((BoostContainer container) =>\n container.settings.uniqueId != settings.uniqueId));\n\n _offstage.add(_onstage);\n _onstage = BoostContainer.obtain(widget.initNavigator, settings);\n\n setState(() {});\n\n for (BoostContainerObserver observer in FlutterBoost\n .singleton.observersHolder\n .observersOf()) {\n observer(ContainerOperation.Push, _onstage.settings);\n }\n Logger.log('ContainerObserver#2 didPush');\n}\n\n这个函数做了三件事情:\n\n页面合法性校验,基于页面的唯一标识uniqueId,作用是防止重复入栈。可以结合containsContainer方法。\n将当前的页面加入offstage列表中,重新生成新的目标页面。\n同镇State数据变更,同时触发观察者回调函数的执行。\n\n以Example中的页面为例,当我们点击打开第二个Flutter页面后,Widget节点中插入了一个SecondRouteWidget。\n\n当这些完成后打印一行日志,标志着一次页面切换动作完成:\n\nContainerObserver#2 didPush\n\n这里有两个细节指的注意,分别是两个断言处理:\nassert(settings.uniqueId != _onstage.settings.uniqueId);\nassert(_offstage.every((BoostContainer container) =>\n container.settings.uniqueId != settings.uniqueId));\n\n在执行入栈pushContainer函数前有一个判断:FlutterBoost.containerManager?.containsContainer(pageId) != true\n只有当整个条件满足时才会触发入栈操作,整个条件会屏蔽两种尝试入栈的情况:\n\n当前显示页面已经是需要入栈的页面,规避一个页面id多次调用入栈\n目标页面处于offstage队列中,如果要显示的页面已经在后台队列中,则忽略当次入栈\n\n这两个情况,第一个好理解,但是第二个初看起来是有瑕疵的:\n\n问题1:加上目标页面已经存在于后台队列,那么如果要显示,是不是应该把他前面的页面全部出栈,然后将他显示出来?\n\n这个疑问我们先放一放,后面再分析。\n页面栈刷新逻辑\n到这里,不知道你有没有疑问,反正我是有的。\n\n问题2:入栈函数调用setState({})触发了Widget刷新,但是build函数内的依赖关系并没有被改变,如何刷新?\n\n@override\nWidget build(BuildContext context) {\n return Overlay(\n key: _overlayKey,\n initialEntries: const [],\n );\n}\n\n正常来说修改稿state一定是在{}中改变的状态属性,并且该属性会被build直接、间接引用,才能达到刷新目的。\n检索一下Manager的上下文,答案很快就揭晓了:setState函数被重载了。\n@override\nvoid setState(VoidCallback fn) {\n if (SchedulerBinding.instance.schedulerPhase ==\n SchedulerPhase.persistentCallbacks) {\n SchedulerBinding.instance.addPostFrameCallback((Duration duration) {\n _refreshOverlayEntries();\n });\n } else {\n _refreshOverlayEntries();\n }\n\n fn();\n //return super.setState(fn);\n}\n\n如果当前Flutter正在进程绘制调度,那么将刷新动作延迟加入下一次绘制的回调函数中。根据API注释,可以知道当persisntCallback代表build/layout/paint之一正在被执行\n/// The persistent callbacks (scheduled by\n/// [WidgetsBinding.addPersistentFrameCallback]) are currently executing.\n///\n/// Typically, this is the build/layout/paint pipeline. See\n/// [WidgetsBinding.drawFrame] and [SchedulerBinding.handleDrawFrame].\npersistentCallbacks,\n\n最后执行传入setState的{}函数。所以说对Overlay的操作就是在_refreshOverlayEntries中进行的。这里还有一个注意点,重载的setState屏蔽了super函数。\n在修改Overlay的过程中,主要分几步:\n\n移除现有的overlay节点\n构造新的BoostConatiner数组,并且map转换为OverlayEntry\n最后更新OverlayState并且添加下一帧刷新函数\n\n最后一个动作的作用有两个:\n\n再次通过channel将页面展示实践回传给native,事件名为onShownContainerChanged;\n第二个刷新焦点,原因是这里每个OverlayEntry其实都有一个原生的Navigator;\n\n现在我们又新增了一个疑问:\n\n问题3:屏蔽了setState的super之后,没有副作用吗?Element如何进行待刷新标记?\n\n \npowered by Gitbook最近更新\n2020-03-23\n"},"boost-container.html":{"url":"boost-container.html","title":"页面容器的视图管理","keywords":"","body":"页面容器的视图管理BoostContainer实现栈操作页面Widget绑定其他页面容器的视图管理\n这一节我们分析页面容器的实现。通过源码对比,可以知道Boost参考了Flutter内部的Navigator实现,进行了相应的调整,更严格的说是继承了Navigator。\n\nclass BoostContainer extends Navigator \n\nBoostContainer实现\n页面容器的实现类是BoostContainer。类似的,他也新增了一些状态的概念:\n\nInit 初始化\nAppear 展示\nWillDisappear 即将消失\nDisappear 页面消失\nDestroy 页面销毁\nBackground 置后台\nForeground 置前台\n\n这些概念虽然不难理解,但是甚至比原生还冗杂😂。\n整个Navigator容器,涉及Widget,State和Observer,在boost中继承关系如下:\n\n\nBoostContainer 继承 Navigator\nBoostContainerState 继承 NavigatorState 重载了push,pop,maybePop等函数,提供了一个返回键函数\nContainerNavigatorObserver 继承 NavigatorObserver ,新增了观察者的注册接口\n\n栈操作\n在自定义的页面容器中,主要重载的是路由的相关出栈、入栈操作。\npop拦截后,如果当前存在原生的Navigator视图栈,则优先弹出,如果不存在,则通过channel转发给了native;\n/// boost_container.dart\n@override\nbool pop([T result]) {\n // ...\n if (canPop()) {\n return super.pop(result);\n } else {\n if (T is Map) {\n FlutterBoost.singleton\n .close(uniqueId, result: result as Map);\n } else {\n FlutterBoost.singleton.close(uniqueId);\n }\n }\n return false;\n}\n\n对push的拦截和pop不同,push拦截只增加了对route的pre和post修饰,最终还是通过调用super,交给了原生的Navigator处理。\n/// boost_container.dart\n@override\nFuture push(Route route) {\n Route newRoute;\n /// ...\n Future future = super.push(newRoute ?? route);\n routerHistory.add(route);\n /// ...\n return future;\n}\n\n总的来说就是出栈需要考虑Navigator自身已经由Native控制的Overlay这一次页面容器,入栈则是使用原生Navigator逻辑。\n页面Widget绑定\n在Container中,我们没有看到build重载,上下文中,也不涉及页面构建逻辑。回顾下我们前面分析的嵌套关系图\n\n\n那么Boost是如何实现的页面绑定关系?\n\n在Flutter中,经常通过WidgetBuilder来实现视图的按需构建。这里Boost定义了一个页面配置的模型。\n/// boost_container.dart\nclass BoostContainerSettings {\n final String uniqueId;\n final String name;\n final Map params;\n final WidgetBuilder builder;\n\n const BoostContainerSettings(\n {this.uniqueId = 'default',\n this.name = 'default',\n this.params,\n this.builder});\n}\n\n其中包含一个builder,最终会透传给Navigator的builder属性,从而实现了Widget的绑定。setting配置在有页面push的时候动态生成,由函数_createContainerSettings负责。\n/// container_coordinator.dart\nfinal BoostContainerSettings routeSettings = BoostContainerSettings(\n uniqueId: pageId,\n name: name,\n params: params,\n builder: (BuildContext ctx) {\n // ...\n //Build a page using default builder.\n if (page == null && _defaultPageBuilder != null) {\n page = _defaultPageBuilder(name, params, pageId);\n }\n // ...\n return page;\n });\n\n其他\n处理页面的出栈入栈相关逻辑,BoostContainer中还添加了一些对栈状态的监听,主要是添加监听器和循环遍历,这里不再展开,相关接口为ContainerNavigatorObserver。\n当Widget dipose时销毁观察者和历史路由页面 \npowered by Gitbook最近更新\n2020-03-23\n"},"boost-router.html":{"url":"boost-router.html","title":"页面路由的实现与差异","keywords":"","body":"页面路由的实现与差异路由绑定页面配置Boost事件定义Boost方法定义页面路由的实现与差异\n在前面的页面分析过程中,多次提到了channel通道的使用。这块通道逻辑都在container_coordinator.dart中,coordinator有调度员的意思,这大概就是路由管理封装类命名的原因吧。\n路由绑定\n既然是容器调度,那么调度员第一步要做的是什么呢?\n自然是先要有可以被灵活调度的容器。因此,Boost使用的第一步就是先进行路由的注册配置。当我们执行registerPageBuilders时,它的具体实现如下:\n/// flutter_boost.dart\n///Register a map builders\nvoid registerPageBuilders(Map builders) {\n ContainerCoordinator.singleton.registerPageBuilders(builders);\n}\n\n可以看到与原生route非常类似,我们仅仅是传入了一个键值对的Map。其中Key是页面路由的么名字,Value其实是一个Builder,类似于WidgetBuilder。差异在于Boost额外封装了一些容器维度的属性,比如说页面的唯一标识,参数等。所以PageBuilder可以简单理解为就是一个个性化的专用WidgetBuilder。\n页面配置\n有了路由表以后,比那可以在合适的时候调用,从路由表中获取目标页面的PageBuilder,然后构建出一个真正的Widget页面。这一步又是怎么实现的呢?\n在《顶层容器栈的实现》一节中,我们通过检索路由表被调用的逻辑,知道当Dart侧收到页面创建事件willShowPageContainer时,回去实例化一个页面。实例化页面的时候,根据事件的参数,构造了一个页面维度的配置,叫做BoostContainerSettings,配置中的WidgetBuilder是用和原生路由配合工作的。\nclass BoostContainerSettings {\n final String uniqueId;\n final String name;\n final Map params;\n final WidgetBuilder builder;\n\n const BoostContainerSettings(\n {this.uniqueId = 'default',\n this.name = 'default',\n this.params,\n this.builder});\n}\n\n配置的生成逻辑如下,当WidgetBuilder被Flutter触发的时候,将构建Widget的任务委托给了PageBuilder处理:\n/// conatiner_coordinator.dart\nBoostContainerSettings _createContainerSettings(\n String name, Map params, String pageId) {\n Widget page;\n\n final BoostContainerSettings routeSettings = BoostContainerSettings(\n uniqueId: pageId,\n name: name,\n params: params,\n builder: (BuildContext ctx) {\n //Try to build a page using keyed builder.\n if (_pageBuilders[name] != null) {\n page = _pageBuilders[name](name, params, pageId);\n }\n\n //Build a page using default builder.\n if (page == null && _defaultPageBuilder != null) {\n page = _defaultPageBuilder(name, params, pageId);\n }\n\n assert(page != null);\n Logger.log('build widget:$page for page:$name($pageId)');\n\n return page;\n });\n\n return routeSettings;\n}\n\n\n进一步的,我们继续分析下,这个WidgetBuilder什么时候会被Flutter触发呢?\n\n简单来说是在Navigator中触发的。我们已经知道BoostContainer本身继承了Navigator,所以它是被当做Navigator来使用的。在构建BoostContainer时,构造器如下:\nfactory BoostContainer.obtain(\n Navigator navigator, BoostContainerSettings settings) =>\n BoostContainer(\n key: GlobalKey(),\n settings: settings,\n onGenerateRoute: (RouteSettings routeSettings) {\n if (routeSettings.name == '/') {\n return BoostPageRoute(\n pageName: settings.name,\n params: settings.params,\n uniqueId: settings.uniqueId,\n animated: false,\n settings: routeSettings,\n builder: settings.builder);\n } else {\n return navigator.onGenerateRoute(routeSettings);\n }\n },\n observers: [\n ContainerNavigatorObserver.bindContainerManager()\n ],\n onUnknownRoute: navigator.onUnknownRoute);\n\n通过onGenerateRoute,将Boost的个性化页面创建最终与Navigator关联了起来。\nBoost事件定义\n事件的定义目前内置了4种,分别是:\n\nbackPressedCallback 返回键事件\nforeground 页面进入前台\nbackground 页面进入后台\nscheduleFrame 调度一次页面绘制\n\n前后台事件触发后,会对当前状态进行标记,具体是通过Boost单例,获取的当前的目标Container容器;最后通知观察者。\n返回事件的处理则会分发至当前Container,触发一次页面的pop动作。\nBoost方法定义\n在使用Boost过程中,我们可以观测到很多标签日志输出,如果要查方法相关的日志,可以过滤关键词onMetohdCall。\n目前支持的核心方法包括:\n\ndidInitPageContainer\nwillShowPageContainer\ndidShowPageContainer\nwillDisappearPageContainer\ndidDisappearPageContainer\nwillDeallocPageContainer\nonNativePageResult\n\n几乎都是围绕着两个页面切换过程中的状态进行的定义。有一个需要注意就是针对页面show的两个事件处理:\n\nwillShowPageContainer\ndidShowPageContainer\n\nwillShow在源码中不会通知其自定义的生命周期回调,didShow会通知。除此之外,两者的实现中都有对页码创建。为什么会存在这种逻辑,目前单纯分析Dart侧代码得不到解释,后续在分析Native源码时可以进一步确认相关调用链路。\npowered by Gitbook最近更新\n2020-03-24\n"},"method-channel.html":{"url":"method-channel.html","title":"Boost全双工通道","keywords":"","body":"Boost全双工通道Boost通信通道Boost全双工通道\n在Flutter与Native通信过程中,框架本身提供了一套Channel机制,方便开发者进行数据的双向读写。\n这一节的标题\"偷用\"了数据通信中的\"双工\"概念,来表示Flutter通信的能力。通过在Native和Dart侧定义Channel通道,开发者可以非常简单就实现框架级别的数据交互。这比WebView和Native直接的通信好用很多,性能也更优,并且不会触发字符串长度问题导致的通信内容截断,有点扯远了。\n在Flutter中,根据不同的使用场景Channel可以进一步细分,目前提供的有:\n\nBasicMessageChannel 基础消息通道\nMethodChannel 方法通道\nOptionalMethodChannel 继承自MethodChannel\nEventChannel 流式通道\n\n如果读者对Channel的使用不慎了解,可以参考通道的使用文档,写的比较清楚:\n\nhttps://flutter.dev/docs/development/platform-integration/platform-channels\n\nBoost通信通道\n在Boost里面通信的场景主要是定义双方的页面栈操作和相关联的事件消息,它使用的是MethodChannel\n/// boost_channel.dart\nfinal MethodChannel _methodChannel = MethodChannel(\"flutter_boost\");\n\n由于通道本身是有开销的,在整个Boost中只有这一个通道,他作为全局单例被共享。我们前文汇总分析到的页面的事件传递,和页面入栈操作这些都是通过这一个通道来完成的。\n在源码中,定义了一个BoostChannel的操作类,内部封装了MethodChannel的使用。它定义了两大类操作,收消息和发消息。\n下面我们通过一张图,来概括BoostChannel所做的事情:\n\n针对消息类的,无论是收还是发,都约定了一个固定的字符串作为事件名__event__。对Native侧发来的消息的识别和监听,事件的名字固定为__event__。其他类型的事件全部进行转发,当做普通方法,有外部进行注册监听。\n发消息包括事件的消息两类,分别是sendEvent和invokeXXXMetohd。\n/// boost_channel.dart\n_methodChannel.setMethodCallHandler((MethodCall call){\n if (call.method == \"__event__\") {\n String name = call.arguments[\"name\"];\n Map arg = call.arguments[\"arguments\"];\n List list = _eventListeners[name];\n if (list != null) {\n for (EventListener l in list) {\n l(name, arg);\n }\n }\n }else{\n for(MethodHandler handler in _methodHandlers) {\n handler(call);\n }\n }\n\n return Future.value();\n});\n\npowered by Gitbook最近更新\n2020-03-24\n"}}} \ No newline at end of file diff --git a/books/boost/source/FlutterActivity.java b/books/boost/source/FlutterActivity.java new file mode 100644 index 0000000..af611b0 --- /dev/null +++ b/books/boost/source/FlutterActivity.java @@ -0,0 +1,953 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.embedding.android; + +import android.app.Activity; +import android.arch.lifecycle.Lifecycle; +import android.arch.lifecycle.LifecycleOwner; +import android.arch.lifecycle.LifecycleRegistry; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import io.flutter.Log; +import io.flutter.embedding.android.FlutterActivityLaunchConfigs.BackgroundMode; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.embedding.engine.FlutterShellArgs; +import io.flutter.embedding.engine.plugins.activity.ActivityControlSurface; +import io.flutter.plugin.platform.PlatformPlugin; +import io.flutter.view.FlutterMain; + +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DART_ENTRYPOINT_META_DATA_KEY; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DEFAULT_BACKGROUND_MODE; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DEFAULT_DART_ENTRYPOINT; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DEFAULT_INITIAL_ROUTE; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_BACKGROUND_MODE; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_CACHED_ENGINE_ID; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_DESTROY_ENGINE_WITH_ACTIVITY; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_INITIAL_ROUTE; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.INITIAL_ROUTE_META_DATA_KEY; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.NORMAL_THEME_META_DATA_KEY; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.SPLASH_SCREEN_META_DATA_KEY; + +/** + * {@code Activity} which displays a fullscreen Flutter UI. + *

              + * {@code FlutterActivity} is the simplest and most direct way to integrate Flutter within an + * Android app. + *

              + * Dart entrypoint, initial route, and app bundle path + *

              + * The Dart entrypoint executed within this {@code Activity} is "main()" by default. To change the + * entrypoint that a {@code FlutterActivity} executes, subclass {@code FlutterActivity} and + * override {@link #getDartEntrypointFunctionName()}. + *

              + * The Flutter route that is initially loaded within this {@code Activity} is "/". The initial + * route may be specified explicitly by passing the name of the route as a {@code String} in + * {@link FlutterActivityLaunchConfigs#EXTRA_INITIAL_ROUTE}, e.g., "my/deep/link". + *

              + * The initial route can each be controlled using a {@link NewEngineIntentBuilder} via + * {@link NewEngineIntentBuilder#initialRoute}. + *

              + * The app bundle path, Dart entrypoint, and initial route can also be controlled in a subclass of + * {@code FlutterActivity} by overriding their respective methods: + *

                + *
              • {@link #getAppBundlePath()}
              • + *
              • {@link #getDartEntrypointFunctionName()}
              • + *
              • {@link #getInitialRoute()}
              • + *
              + *

              + * The Dart entrypoint and app bundle path are not supported as {@code Intent} parameters due to + * security concerns. If such configurations were exposed via {@code Intent}, then a + * {@code FlutterActivity} that is {@code exported} from your Android app would allow other apps to + * invoke arbitrary Dart entrypoints in your app by specifying different Dart entrypoints for your + * {@code FlutterActivity}. Therefore, these configurations are not available via {@code Intent}. + *

              + * Using a cached FlutterEngine + *

              + * {@code FlutterActivity} can be used with a cached {@link FlutterEngine} instead of creating a new + * one. Use {@link #withCachedEngine(String)} to build a {@code FlutterActivity} {@code Intent} that + * is configured to use an existing, cached {@link FlutterEngine}. + * {@link io.flutter.embedding.engine.FlutterEngineCache} is the cache that is used to obtain a + * given cached {@link FlutterEngine}. An {@code IllegalStateException} will be thrown if a cached + * engine is requested but does not exist in the cache. + *

              + * When using a cached {@link FlutterEngine}, that {@link FlutterEngine} should already be executing + * Dart code, which means that the Dart entrypoint and initial route have already been defined. + * Therefore, {@link CachedEngineIntentBuilder} does not offer configuration of these properties. + *

              + * It is generally recommended to use a cached {@link FlutterEngine} to avoid a momentary delay + * when initializing a new {@link FlutterEngine}. The two exceptions to using a cached + * {@link FlutterEngine} are: + *

              + *

                + *
              • When {@code FlutterActivity} is the first {@code Activity} displayed by the app, because + * pre-warming a {@link FlutterEngine} would have no impact in this situation.
              • + *
              • When you are unsure when/if you will need to display a Flutter experience.
              • + *
              + *

              + * The following illustrates how to pre-warm and cache a {@link FlutterEngine}: + *

              + * {@code + * // Create and pre-warm a FlutterEngine. + * FlutterEngine flutterEngine = new FlutterEngine(context); + * flutterEngine + * .getDartExecutor() + * .executeDartEntrypoint(DartEntrypoint.createDefault()); + * + * // Cache the pre-warmed FlutterEngine in the FlutterEngineCache. + * FlutterEngineCache.getInstance().put("my_engine", flutterEngine); + * } + *

              + * Alternatives to FlutterActivity + *

              + * If Flutter is needed in a location that cannot use an {@code Activity}, consider using + * a {@link FlutterFragment}. Using a {@link FlutterFragment} requires forwarding some calls from + * an {@code Activity} to the {@link FlutterFragment}. + *

              + * If Flutter is needed in a location that can only use a {@code View}, consider using a + * {@link FlutterView}. Using a {@link FlutterView} requires forwarding some calls from an + * {@code Activity}, as well as forwarding lifecycle calls from an {@code Activity} or a + * {@code Fragment}. + *

              + * FlutterActivity responsibilities + *

              + * {@code FlutterActivity} maintains the following responsibilities: + *

                + *
              • Displays an Android launch screen.
              • + *
              • Displays a Flutter splash screen.
              • + *
              • Configures the status bar appearance.
              • + *
              • Chooses the Dart execution app bundle path and entrypoint.
              • + *
              • Chooses Flutter's initial route.
              • + *
              • Renders {@code Activity} transparently, if desired.
              • + *
              • Offers hooks for subclasses to provide and configure a {@link FlutterEngine}.
              • + *
              + *

              + * Launch Screen and Splash Screen + *

              + * {@code FlutterActivity} supports the display of an Android "launch screen" as well as a + * Flutter-specific "splash screen". The launch screen is displayed while the Android application + * loads. It is only applicable if {@code FlutterActivity} is the first {@code Activity} displayed + * upon loading the app. After the launch screen passes, a splash screen is optionally displayed. + * The splash screen is displayed for as long as it takes Flutter to initialize and render its + * first frame. + *

              + * Use Android themes to display a launch screen. Create two themes: a launch theme and a normal + * theme. In the launch theme, set {@code windowBackground} to the desired {@code Drawable} for + * the launch screen. In the normal theme, set {@code windowBackground} to any desired background + * color that should normally appear behind your Flutter content. In most cases this background + * color will never be seen, but for possible transition edge cases it is a good idea to explicitly + * replace the launch screen window background with a neutral color. + *

              + * Do not change aspects of system chrome between a launch theme and normal theme. Either define + * both themes to be fullscreen or not, and define both themes to display the same status bar and + * navigation bar settings. To adjust system chrome once the Flutter app renders, use platform + * channels to instruct Android to do so at the appropriate time. This will avoid any jarring visual + * changes during app startup. + *

              + * In the AndroidManifest.xml, set the theme of {@code FlutterActivity} to the defined launch theme. + * In the metadata section for {@code FlutterActivity}, defined the following reference to your + * normal theme: + * + * {@code + * + * } + * + * With themes defined, and AndroidManifest.xml updated, Flutter displays the specified launch + * screen until the Android application is initialized. + *

              + * Flutter also requires initialization time. To specify a splash screen for Flutter initialization, + * subclass {@code FlutterActivity} and override {@link #provideSplashScreen()}. See + * {@link SplashScreen} for details on implementing a splash screen. + *

              + * Flutter ships with a splash screen that automatically displays the exact same + * {@code windowBackground} as the launch theme discussed previously. To use that splash screen, + * include the following metadata in AndroidManifest.xml for this {@code FlutterActivity}: + * + * {@code + * + * } + *

              + * Alternative Activity + * {@link FlutterFragmentActivity} is also available, which is similar to {@code FlutterActivity} + * but it extends {@code FragmentActivity}. You should use {@code FlutterActivity}, if possible, + * but if you need a {@code FragmentActivity} then you should use {@link FlutterFragmentActivity}. + */ +// A number of methods in this class have the same implementation as FlutterFragmentActivity. These +// methods are duplicated for readability purposes. Be sure to replicate any change in this class in +// FlutterFragmentActivity, too. +public class FlutterActivity extends Activity + implements FlutterActivityAndFragmentDelegate.Host, + LifecycleOwner { + private static final String TAG = "FlutterActivity"; + + /** + * Creates an {@link Intent} that launches a {@code FlutterActivity}, which executes + * a {@code main()} Dart entrypoint, and displays the "/" route as Flutter's initial route. + */ + @NonNull + public static Intent createDefaultIntent(@NonNull Context launchContext) { + return withNewEngine().build(launchContext); + } + + /** + * Creates an {@link NewEngineIntentBuilder}, which can be used to configure an {@link Intent} to + * launch a {@code FlutterActivity} that internally creates a new {@link FlutterEngine} using + * the desired Dart entrypoint, initial route, etc. + */ + @NonNull + public static NewEngineIntentBuilder withNewEngine() { + return new NewEngineIntentBuilder(FlutterActivity.class); + } + + /** + * Builder to create an {@code Intent} that launches a {@code FlutterActivity} with a new + * {@link FlutterEngine} and the desired configuration. + */ + public static class NewEngineIntentBuilder { + private final Class activityClass; + private String initialRoute = DEFAULT_INITIAL_ROUTE; + private String backgroundMode = DEFAULT_BACKGROUND_MODE; + + /** + * Constructor that allows this {@code NewEngineIntentBuilder} to be used by subclasses of + * {@code FlutterActivity}. + *

              + * Subclasses of {@code FlutterActivity} should provide their own static version of + * {@link #withNewEngine()}, which returns an instance of {@code NewEngineIntentBuilder} + * constructed with a {@code Class} reference to the {@code FlutterActivity} subclass, + * e.g.: + *

              + * {@code + * return new NewEngineIntentBuilder(MyFlutterActivity.class); + * } + */ + protected NewEngineIntentBuilder(@NonNull Class activityClass) { + this.activityClass = activityClass; + } + + /** + * The initial route that a Flutter app will render in this {@link FlutterFragment}, + * defaults to "/". + */ + @NonNull + public NewEngineIntentBuilder initialRoute(@NonNull String initialRoute) { + this.initialRoute = initialRoute; + return this; + } + + /** + * The mode of {@code FlutterActivity}'s background, either {@link BackgroundMode#opaque} or + * {@link BackgroundMode#transparent}. + *

              + * The default background mode is {@link BackgroundMode#opaque}. + *

              + * Choosing a background mode of {@link BackgroundMode#transparent} will configure the inner + * {@link FlutterView} of this {@code FlutterActivity} to be configured with a + * {@link FlutterTextureView} to support transparency. This choice has a non-trivial performance + * impact. A transparent background should only be used if it is necessary for the app design + * being implemented. + *

              + * A {@code FlutterActivity} that is configured with a background mode of + * {@link BackgroundMode#transparent} must have a theme applied to it that includes the + * following property: {@code true}. + */ + @NonNull + public NewEngineIntentBuilder backgroundMode(@NonNull BackgroundMode backgroundMode) { + this.backgroundMode = backgroundMode.name(); + return this; + } + + /** + * Creates and returns an {@link Intent} that will launch a {@code FlutterActivity} with + * the desired configuration. + */ + @NonNull + public Intent build(@NonNull Context context) { + return new Intent(context, activityClass) + .putExtra(EXTRA_INITIAL_ROUTE, initialRoute) + .putExtra(EXTRA_BACKGROUND_MODE, backgroundMode) + .putExtra(EXTRA_DESTROY_ENGINE_WITH_ACTIVITY, true); + } + } + + /** + * Creates a {@link CachedEngineIntentBuilder}, which can be used to configure an {@link Intent} + * to launch a {@code FlutterActivity} that internally uses an existing {@link FlutterEngine} that + * is cached in {@link io.flutter.embedding.engine.FlutterEngineCache}. + */ + public static CachedEngineIntentBuilder withCachedEngine(@NonNull String cachedEngineId) { + return new CachedEngineIntentBuilder(FlutterActivity.class, cachedEngineId); + } + + /** + * Builder to create an {@code Intent} that launches a {@code FlutterActivity} with an existing + * {@link FlutterEngine} that is cached in {@link io.flutter.embedding.engine.FlutterEngineCache}. + */ + public static class CachedEngineIntentBuilder { + private final Class activityClass; + private final String cachedEngineId; + private boolean destroyEngineWithActivity = false; + private String backgroundMode = DEFAULT_BACKGROUND_MODE; + + /** + * Constructor that allows this {@code CachedEngineIntentBuilder} to be used by subclasses of + * {@code FlutterActivity}. + *

              + * Subclasses of {@code FlutterActivity} should provide their own static version of + * {@link #withNewEngine()}, which returns an instance of {@code CachedEngineIntentBuilder} + * constructed with a {@code Class} reference to the {@code FlutterActivity} subclass, + * e.g.: + *

              + * {@code + * return new CachedEngineIntentBuilder(MyFlutterActivity.class, engineId); + * } + */ + protected CachedEngineIntentBuilder( + @NonNull Class activityClass, + @NonNull String engineId + ) { + this.activityClass = activityClass; + this.cachedEngineId = engineId; + } + + /** + * Returns true if the cached {@link FlutterEngine} should be destroyed and removed from the + * cache when this {@code FlutterActivity} is destroyed. + *

              + * The default value is {@code false}. + */ + public CachedEngineIntentBuilder destroyEngineWithActivity(boolean destroyEngineWithActivity) { + this.destroyEngineWithActivity = destroyEngineWithActivity; + return this; + } + + /** + * The mode of {@code FlutterActivity}'s background, either {@link BackgroundMode#opaque} or + * {@link BackgroundMode#transparent}. + *

              + * The default background mode is {@link BackgroundMode#opaque}. + *

              + * Choosing a background mode of {@link BackgroundMode#transparent} will configure the inner + * {@link FlutterView} of this {@code FlutterActivity} to be configured with a + * {@link FlutterTextureView} to support transparency. This choice has a non-trivial performance + * impact. A transparent background should only be used if it is necessary for the app design + * being implemented. + *

              + * A {@code FlutterActivity} that is configured with a background mode of + * {@link BackgroundMode#transparent} must have a theme applied to it that includes the + * following property: {@code true}. + */ + @NonNull + public CachedEngineIntentBuilder backgroundMode(@NonNull BackgroundMode backgroundMode) { + this.backgroundMode = backgroundMode.name(); + return this; + } + + /** + * Creates and returns an {@link Intent} that will launch a {@code FlutterActivity} with + * the desired configuration. + */ + @NonNull + public Intent build(@NonNull Context context) { + return new Intent(context, activityClass) + .putExtra(EXTRA_CACHED_ENGINE_ID, cachedEngineId) + .putExtra(EXTRA_DESTROY_ENGINE_WITH_ACTIVITY, destroyEngineWithActivity) + .putExtra(EXTRA_BACKGROUND_MODE, backgroundMode); + } + } + + // Delegate that runs all lifecycle and OS hook logic that is common between + // FlutterActivity and FlutterFragment. See the FlutterActivityAndFragmentDelegate + // implementation for details about why it exists. + @VisibleForTesting + protected FlutterActivityAndFragmentDelegate delegate; + + @NonNull + private LifecycleRegistry lifecycle; + + public FlutterActivity() { + lifecycle = new LifecycleRegistry(this); + } + + /** + * This method exists so that JVM tests can ensure that a delegate exists without + * putting this Activity through any lifecycle events, because JVM tests cannot handle + * executing any lifecycle methods, at the time of writing this. + *

              + * The testing infrastructure should be upgraded to make FlutterActivity tests easy to + * write while exercising real lifecycle methods. At such a time, this method should be + * removed. + */ + // TODO(mattcarroll): remove this when tests allow for it (https://github.com/flutter/flutter/issues/43798) + @VisibleForTesting + /* package */ void setDelegate(@NonNull FlutterActivityAndFragmentDelegate delegate) { + this.delegate = delegate; + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + switchLaunchThemeForNormalTheme(); + + super.onCreate(savedInstanceState); + + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); + + delegate = new FlutterActivityAndFragmentDelegate(this); + delegate.onAttach(this); + delegate.onActivityCreated(savedInstanceState); + + configureWindowForTransparency(); + setContentView(createFlutterView()); + configureStatusBarForFullscreenFlutterExperience(); + } + + /** + * Switches themes for this {@code Activity} from the theme used to launch this + * {@code Activity} to a "normal theme" that is intended for regular {@code Activity} + * operation. + *

              + * This behavior is offered so that a "launch screen" can be displayed while the + * application initially loads. To utilize this behavior in an app, do the following: + *

                + *
              1. Create 2 different themes in style.xml: one theme for the launch screen and + * one theme for normal display. + *
              2. In the launch screen theme, set the "windowBackground" property to a {@code Drawable} + * of your choice. + *
              3. In the normal theme, customize however you'd like. + *
              4. In the AndroidManifest.xml, set the theme of your {@code FlutterActivity} to + * your launch theme. + *
              5. Add a {@code } property to your {@code FlutterActivity} with a name + * of "io.flutter.embedding.android.NormalTheme" and set the resource to your normal + * theme, e.g., {@code android:resource="@style/MyNormalTheme}. + *
              + * With the above settings, your launch theme will be used when loading the app, and + * then the theme will be switched to your normal theme once the app has initialized. + *

              + * Do not change aspects of system chrome between a launch theme and normal theme. Either define + * both themes to be fullscreen or not, and define both themes to display the same status bar and + * navigation bar settings. If you wish to adjust system chrome once your Flutter app renders, use + * platform channels to instruct Android to do so at the appropriate time. This will avoid any + * jarring visual changes during app startup. + */ + private void switchLaunchThemeForNormalTheme() { + try { + ActivityInfo activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA); + if (activityInfo.metaData != null) { + int normalThemeRID = activityInfo.metaData.getInt(NORMAL_THEME_META_DATA_KEY, -1); + if (normalThemeRID != -1) { + setTheme(normalThemeRID); + } + } else { + Log.d(TAG, "Using the launch theme as normal theme."); + } + } catch (PackageManager.NameNotFoundException exception) { + Log.e(TAG, "Could not read meta-data for FlutterActivity. Using the launch theme as normal theme."); + } + } + + @Nullable + @Override + public SplashScreen provideSplashScreen() { + Drawable manifestSplashDrawable = getSplashScreenFromManifest(); + if (manifestSplashDrawable != null) { + return new DrawableSplashScreen(manifestSplashDrawable); + } else { + return null; + } + } + + /** + * Returns a {@link Drawable} to be used as a splash screen as requested by meta-data in the + * {@code AndroidManifest.xml} file, or null if no such splash screen is requested. + *

              + * See {@link FlutterActivityLaunchConfigs#SPLASH_SCREEN_META_DATA_KEY} for the meta-data key to + * be used in a manifest file. + */ + @Nullable + @SuppressWarnings("deprecation") + private Drawable getSplashScreenFromManifest() { + try { + ActivityInfo activityInfo = getPackageManager().getActivityInfo( + getComponentName(), + PackageManager.GET_META_DATA + ); + Bundle metadata = activityInfo.metaData; + int splashScreenId = metadata != null ? metadata.getInt(SPLASH_SCREEN_META_DATA_KEY) : 0; + return splashScreenId != 0 + ? Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP + ? getResources().getDrawable(splashScreenId, getTheme()) + : getResources().getDrawable(splashScreenId) + : null; + } catch (PackageManager.NameNotFoundException e) { + // This is never expected to happen. + return null; + } + } + + /** + * Sets this {@code Activity}'s {@code Window} background to be transparent, and hides the status + * bar, if this {@code Activity}'s desired {@link BackgroundMode} is {@link BackgroundMode#transparent}. + *

              + * For {@code Activity} transparency to work as expected, the theme applied to this {@code Activity} + * must include {@code true}. + */ + private void configureWindowForTransparency() { + BackgroundMode backgroundMode = getBackgroundMode(); + if (backgroundMode == BackgroundMode.transparent) { + getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + ); + } + } + + @NonNull + private View createFlutterView() { + return delegate.onCreateView( + null /* inflater */, + null /* container */, + null /* savedInstanceState */); + } + + private void configureStatusBarForFullscreenFlutterExperience() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(0x40000000); + window.getDecorView().setSystemUiVisibility(PlatformPlugin.DEFAULT_SYSTEM_UI); + } + } + + @Override + protected void onStart() { + super.onStart(); + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START); + delegate.onStart(); + } + + @Override + protected void onResume() { + super.onResume(); + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME); + delegate.onResume(); + } + + @Override + public void onPostResume() { + super.onPostResume(); + delegate.onPostResume(); + } + + @Override + protected void onPause() { + super.onPause(); + delegate.onPause(); + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); + } + + @Override + protected void onStop() { + super.onStop(); + delegate.onStop(); + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + delegate.onSaveInstanceState(outState); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + delegate.onDestroyView(); + delegate.onDetach(); + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + delegate.onActivityResult(requestCode, resultCode, data); + } + + @Override + protected void onNewIntent(@NonNull Intent intent) { + // TODO(mattcarroll): change G3 lint rule that forces us to call super + super.onNewIntent(intent); + delegate.onNewIntent(intent); + } + + @Override + public void onBackPressed() { + delegate.onBackPressed(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + delegate.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + + @Override + public void onUserLeaveHint() { + delegate.onUserLeaveHint(); + } + + @Override + public void onTrimMemory(int level) { + super.onTrimMemory(level); + delegate.onTrimMemory(level); + } + + /** + * {@link FlutterActivityAndFragmentDelegate.Host} method that is used by + * {@link FlutterActivityAndFragmentDelegate} to obtain a {@code Context} reference as + * needed. + */ + @Override + @NonNull + public Context getContext() { + return this; + } + + /** + * {@link FlutterActivityAndFragmentDelegate.Host} method that is used by + * {@link FlutterActivityAndFragmentDelegate} to obtain an {@code Activity} reference as + * needed. This reference is used by the delegate to instantiate a {@link FlutterView}, + * a {@link PlatformPlugin}, and to determine if the {@code Activity} is changing + * configurations. + */ + @Override + @NonNull + public Activity getActivity() { + return this; + } + + /** + * {@link FlutterActivityAndFragmentDelegate.Host} method that is used by + * {@link FlutterActivityAndFragmentDelegate} to obtain a {@code Lifecycle} reference as + * needed. This reference is used by the delegate to provide Flutter plugins with access + * to lifecycle events. + */ + @Override + @NonNull + public Lifecycle getLifecycle() { + return lifecycle; + } + + /** + * {@link FlutterActivityAndFragmentDelegate.Host} method that is used by + * {@link FlutterActivityAndFragmentDelegate} to obtain Flutter shell arguments when + * initializing Flutter. + */ + @NonNull + @Override + public FlutterShellArgs getFlutterShellArgs() { + return FlutterShellArgs.fromIntent(getIntent()); + } + + /** + * Returns the ID of a statically cached {@link FlutterEngine} to use within this + * {@code FlutterActivity}, or {@code null} if this {@code FlutterActivity} does not want to + * use a cached {@link FlutterEngine}. + */ + @Override + @Nullable + public String getCachedEngineId() { + return getIntent().getStringExtra(EXTRA_CACHED_ENGINE_ID); + } + + /** + * Returns false if the {@link FlutterEngine} backing this {@code FlutterActivity} should + * outlive this {@code FlutterActivity}, or true to be destroyed when the {@code FlutterActivity} + * is destroyed. + *

              + * The default value is {@code true} in cases where {@code FlutterActivity} created its own + * {@link FlutterEngine}, and {@code false} in cases where a cached {@link FlutterEngine} was + * provided. + */ + @Override + public boolean shouldDestroyEngineWithHost() { + boolean explicitDestructionRequested = getIntent().getBooleanExtra(EXTRA_DESTROY_ENGINE_WITH_ACTIVITY, false); + if (getCachedEngineId() != null || delegate.isFlutterEngineFromHost()) { + // Only destroy a cached engine if explicitly requested by app developer. + return explicitDestructionRequested; + } else { + // If this Activity created the FlutterEngine, destroy it by default unless + // explicitly requested not to. + return getIntent().getBooleanExtra(EXTRA_DESTROY_ENGINE_WITH_ACTIVITY, true); + } + } + + /** + * The Dart entrypoint that will be executed as soon as the Dart snapshot is loaded. + *

              + * This preference can be controlled by setting a {@code } called + * {@link FlutterActivityLaunchConfigs#DART_ENTRYPOINT_META_DATA_KEY} within the Android manifest + * definition for this {@code FlutterActivity}. + *

              + * Subclasses may override this method to directly control the Dart entrypoint. + */ + @NonNull + public String getDartEntrypointFunctionName() { + try { + ActivityInfo activityInfo = getPackageManager().getActivityInfo( + getComponentName(), + PackageManager.GET_META_DATA + ); + Bundle metadata = activityInfo.metaData; + String desiredDartEntrypoint = metadata != null ? metadata.getString(DART_ENTRYPOINT_META_DATA_KEY) : null; + return desiredDartEntrypoint != null ? desiredDartEntrypoint : DEFAULT_DART_ENTRYPOINT; + } catch (PackageManager.NameNotFoundException e) { + return DEFAULT_DART_ENTRYPOINT; + } + } + + /** + * The initial route that a Flutter app will render upon loading and executing its Dart code. + *

              + * This preference can be controlled with 2 methods: + *

                + *
              1. Pass a boolean as {@link FlutterActivityLaunchConfigs#EXTRA_INITIAL_ROUTE} with the + * launching {@code Intent}, or
              2. + *
              3. Set a {@code } called + * {@link FlutterActivityLaunchConfigs#INITIAL_ROUTE_META_DATA_KEY} for this {@code Activity} + * in the Android manifest.
              4. + *
              + * If both preferences are set, the {@code Intent} preference takes priority. + *

              + * The reason that a {@code } preference is supported is because this {@code Activity} + * might be the very first {@code Activity} launched, which means the developer won't have + * control over the incoming {@code Intent}. + *

              + * Subclasses may override this method to directly control the initial route. + */ + @NonNull + public String getInitialRoute() { + if (getIntent().hasExtra(EXTRA_INITIAL_ROUTE)) { + return getIntent().getStringExtra(EXTRA_INITIAL_ROUTE); + } + + try { + ActivityInfo activityInfo = getPackageManager().getActivityInfo( + getComponentName(), + PackageManager.GET_META_DATA + ); + Bundle metadata = activityInfo.metaData; + String desiredInitialRoute = metadata != null ? metadata.getString(INITIAL_ROUTE_META_DATA_KEY) : null; + return desiredInitialRoute != null ? desiredInitialRoute : DEFAULT_INITIAL_ROUTE; + } catch (PackageManager.NameNotFoundException e) { + return DEFAULT_INITIAL_ROUTE; + } + } + + /** + * The path to the bundle that contains this Flutter app's resources, e.g., Dart code snapshots. + *

              + * When this {@code FlutterActivity} is run by Flutter tooling and a data String is included + * in the launching {@code Intent}, that data String is interpreted as an app bundle path. + *

              + * By default, the app bundle path is obtained from {@link FlutterMain#findAppBundlePath()}. + *

              + * Subclasses may override this method to return a custom app bundle path. + */ + @NonNull + public String getAppBundlePath() { + // If this Activity was launched from tooling, and the incoming Intent contains + // a custom app bundle path, return that path. + // TODO(mattcarroll): determine if we should have an explicit FlutterTestActivity instead of conflating. + if (isDebuggable() && Intent.ACTION_RUN.equals(getIntent().getAction())) { + String appBundlePath = getIntent().getDataString(); + if (appBundlePath != null) { + return appBundlePath; + } + } + + // Return the default app bundle path. + // TODO(mattcarroll): move app bundle resolution into an appropriately named class. + return FlutterMain.findAppBundlePath(); + } + + /** + * Returns true if Flutter is running in "debug mode", and false otherwise. + *

              + * Debug mode allows Flutter to operate with hot reload and hot restart. Release mode does not. + */ + private boolean isDebuggable() { + return (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + } + + /** + * {@link FlutterActivityAndFragmentDelegate.Host} method that is used by + * {@link FlutterActivityAndFragmentDelegate} to obtain the desired {@link FlutterView.RenderMode} + * that should be used when instantiating a {@link FlutterView}. + */ + @NonNull + @Override + public FlutterView.RenderMode getRenderMode() { + return getBackgroundMode() == BackgroundMode.opaque + ? FlutterView.RenderMode.surface + : FlutterView.RenderMode.texture; + } + + /** + * {@link FlutterActivityAndFragmentDelegate.Host} method that is used by + * {@link FlutterActivityAndFragmentDelegate} to obtain the desired + * {@link FlutterView.TransparencyMode} that should be used when instantiating a + * {@link FlutterView}. + */ + @NonNull + @Override + public FlutterView.TransparencyMode getTransparencyMode() { + return getBackgroundMode() == BackgroundMode.opaque + ? FlutterView.TransparencyMode.opaque + : FlutterView.TransparencyMode.transparent; + } + + /** + * The desired window background mode of this {@code Activity}, which defaults to + * {@link BackgroundMode#opaque}. + */ + @NonNull + protected BackgroundMode getBackgroundMode() { + if (getIntent().hasExtra(EXTRA_BACKGROUND_MODE)) { + return BackgroundMode.valueOf(getIntent().getStringExtra(EXTRA_BACKGROUND_MODE)); + } else { + return BackgroundMode.opaque; + } + } + + /** + * Hook for subclasses to easily provide a custom {@link FlutterEngine}. + *

              + * This hook is where a cached {@link FlutterEngine} should be provided, if a cached + * {@link FlutterEngine} is desired. + */ + @Nullable + @Override + public FlutterEngine provideFlutterEngine(@NonNull Context context) { + // No-op. Hook for subclasses. + return null; + } + + /** + * Hook for subclasses to obtain a reference to the {@link FlutterEngine} that is owned + * by this {@code FlutterActivity}. + */ + @Nullable + protected FlutterEngine getFlutterEngine() { + return delegate.getFlutterEngine(); + } + + @Nullable + @Override + public PlatformPlugin providePlatformPlugin(@Nullable Activity activity, @NonNull FlutterEngine flutterEngine) { + if (activity != null) { + return new PlatformPlugin(getActivity(), flutterEngine.getPlatformChannel()); + } else { + return null; + } + } + + /** + * Hook for subclasses to easily configure a {@code FlutterEngine}, e.g., register + * plugins. + *

              + * This method is called after {@link #provideFlutterEngine(Context)}. + */ + @Override + public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { + // No-op. Hook for subclasses. + } + + /** + * Hook for the host to cleanup references that were established in + * {@link #configureFlutterEngine(FlutterEngine)} before the host is destroyed or detached. + *

              + * This method is called in {@link #onDestroy()}. + */ + @Override + public void cleanUpFlutterEngine(@NonNull FlutterEngine flutterEngine) { + // No-op. Hook for subclasses. + } + + /** + * Hook for subclasses to control whether or not the {@link FlutterFragment} within this + * {@code Activity} automatically attaches its {@link FlutterEngine} to this {@code Activity}. + *

              + * This property is controlled with a protected method instead of an {@code Intent} argument because + * the only situation where changing this value would help, is a situation in which + * {@code FlutterActivity} is being subclassed to utilize a custom and/or cached {@link FlutterEngine}. + *

              + * Defaults to {@code true}. + *

              + * Control surfaces are used to provide Android resources and lifecycle events to + * plugins that are attached to the {@link FlutterEngine}. If {@code shouldAttachEngineToActivity} + * is true then this {@code FlutterActivity} will connect its {@link FlutterEngine} to itself, + * along with any plugins that are registered with that {@link FlutterEngine}. This allows + * plugins to access the {@code Activity}, as well as receive {@code Activity}-specific calls, + * e.g., {@link Activity#onNewIntent(Intent)}. If {@code shouldAttachEngineToActivity} is false, + * then this {@code FlutterActivity} will not automatically manage the connection between its + * {@link FlutterEngine} and itself. In this case, plugins will not be offered a reference to + * an {@code Activity} or its OS hooks. + *

              + * Returning false from this method does not preclude a {@link FlutterEngine} from being + * attaching to a {@code FlutterActivity} - it just prevents the attachment from happening + * automatically. A developer can choose to subclass {@code FlutterActivity} and then + * invoke {@link ActivityControlSurface#attachToActivity(Activity, Lifecycle)} + * and {@link ActivityControlSurface#detachFromActivity()} at the desired times. + *

              + * One reason that a developer might choose to manually manage the relationship between the + * {@code Activity} and {@link FlutterEngine} is if the developer wants to move the + * {@link FlutterEngine} somewhere else. For example, a developer might want the + * {@link FlutterEngine} to outlive this {@code FlutterActivity} so that it can be used + * later in a different {@code Activity}. To accomplish this, the {@link FlutterEngine} may + * need to be disconnected from this {@code FluttterActivity} at an unusual time, preventing + * this {@code FlutterActivity} from correctly managing the relationship between the + * {@link FlutterEngine} and itself. + */ + @Override + public boolean shouldAttachEngineToActivity() { + return true; + } + + @Override + public void onFlutterUiDisplayed() { + // Notifies Android that we're fully drawn so that performance metrics can be collected by + // Flutter performance tests. + // This was supported in KitKat (API 19), but has a bug around requiring + // permissions. See https://github.com/flutter/flutter/issues/46172 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + reportFullyDrawn(); + } + } + + @Override + public void onFlutterUiNoLongerDisplayed() { + // no-op + } + +} \ No newline at end of file diff --git a/books/dev/algorithm/index.html b/books/dev/algorithm/index.html index 16cecc3..7e6e4a9 100644 --- a/books/dev/algorithm/index.html +++ b/books/dev/algorithm/index.html @@ -231,14 +231,30 @@ -

            • +
            • - + 2.2. - OkHttp3 + AndResguard + + + + + + + +
            • + +
            • - 2.4. + 2.3. - Retrofit2 + OkHttp3 @@ -276,14 +297,14 @@
            • -
            • +
            • - 2.5. + 2.4. - Glide + Retrofit2 @@ -291,14 +312,14 @@
            • -
            • +
            • - 2.6. + 2.5. - Picasso + Glide @@ -306,12 +327,12 @@
            • -
            • +
            • - 2.7. + 2.6. AndroidGodEye @@ -321,12 +342,12 @@
            • -
            • +
            • - 2.8. + 2.7. JVM运行时 @@ -336,12 +357,12 @@
            • -
            • +
            • - 2.9. + 2.8. Java内存模型 @@ -351,12 +372,12 @@
            • -
            • +
            • - 2.10. + 2.9. GC&算法 @@ -366,12 +387,12 @@
            • -
            • +
            • - 2.11. + 2.10. 认识字节码 @@ -381,12 +402,12 @@
            • -
            • +
            • - 2.12. + 2.11. ASM字节码修改 @@ -396,12 +417,12 @@
            • -
            • +
            • - 2.13. + 2.12. Lambda语法 @@ -411,12 +432,12 @@
            • -
            • +
            • - 2.14. + 2.13. DVM&Dex @@ -426,12 +447,12 @@
            • -
            • +
            • - 2.15. + 2.14. APK打包 @@ -464,13 +485,88 @@