创建组件

真正创建出一个组件,需要在创建流程中完成。当用户传入一个组件名称,框架内部就会根据名称去之前解析过好的数据里找到与此名称匹配的模板数据,然后构造出组件来。整个创建组件的过程起始就是编译过程的逆过程。

  1. 用户传入一个组件名,这个名字就是解析阶段第9步解析出来的名称,否则找不到对应的组件数据,无法创建组件。
  2. 找到原始组件数据,并通过之前记录的组件数据起始位置直接定位到二进制数组组件数据开始的地方,准备开始创建组件。
  3. 进入循环,先读取一字节,判断是节点开始标记还是结束标记。节点开始标记说明刚开始处理一个新的基础组件的信息,开始第4步;节点结束标记说明已经构造完一个基础组件,跳到第11步。如果都不是,组件创建失败。
  4. 如果是阶段开始标记,先读取一字节节点类型。
  5. 根据节点类型创建基础组件实例,这个类型与组件类型的映射关系也是框架已经提前注册好或者用户注册过。就跟编译过程的第7步一样,序列化后的1字节类型值和编译器类、基础组件实现类都是一一对应的。如果已存在创建好的基础组件节点,说明对当前新节点有父容器,将它做压栈暂存。
  6. 创建一个基础组件实例。
  7. 为组件实例设置好布局参数对象,与布局相关的参数信息最终会传给这个布局参数对象。
  8. 按照int整型、float浮点型、string字符串、表达式四类属性的顺序开始读取四种属性。
  9. 读取每一种类型的属性,都进入一个小循环。 a) 先读取该类型属性的值的数量 b) 循环读取其中的key、value,按照文件格式,都是四字节。 c) 根据属性的key,传递value给基础组件实例里的对应属性,如果碰到字符串或者表达式,都通过索引去解析过程里构造的字符串池或者表达式池里取出具体对象传给基础组件。
  10. 处理完所有属性,继续读取下一字节。回到第3步。
  11. 如果是节点结束标记,开始检查有没有上次创建的基础组件节点。若有,跳到第13步,没有,跳到第12步。
  12. 所有节点已经处理完毕,可以结束。
  13. 说明当前节点是上次创建节点的子阶段,检查上次创建的节点是否是容器类型,若是,跳到第15步,否则跳到第14步。
  14. 非容器基础组件节点不能嵌套其它基础组件节点,整个组件创建失败。
  15. 添加到父容器节点里,上次暂存的父容器节点出栈。
  16. 继续回到第3步处理。

最新的: