最近做新的分组主题页面自适应时遇到一个问题,初始话中使用stage报空对象。
研究了一下flex的初始化顺序好,发现原因主要跟 Application 四大初始化事件有关,必须弄清楚这四个事件。
这里大概说一下 这四个初始化事件到底什么情况下分派(其实 Application 初始化是一个很复杂的过程,这里就省略这些部分了)
四大初始化事件:preinitialize,initialize,creationComplete,apllicationComplete
1. preinitialize 的分派
应用程序 application 已实例化,但此时还未创建任何相关的孩子组件(child component),但是此时 application可获取孩子数。
2. initialize 的分派
此时,创建了相应的孩子组件,但还未对这些子组件进行布局。
3. creationComplete 的分派
应用程序application完成全部实例化,并完成所有子组件的布局
4. apllicationComplete 的分派
上面三处事件的完成,表明application内部启动的整个进程完成,就把 Application实例加入舞台(stage),接下来便会通知SystemManager派发applicationComplete事件。此时,启动程序启动完成并准备运行。
所有 在 applicaiton 的 preinitialize,initialize,creationComplete 事件处理函数里面 获取 stage, 这样肯定是null, 此时applicaiton实例还没有加入 stage,Application实例加入到舞台后,派发ApplicationComplete事件。所以,应该在ApplicationComplete 事件派发后获取 stage。
另外,在网上搜了一下,同样有两种解决办法(项目实际应用中均不行,使用上面的方法才可以)供参考:
1. 调用callLater方法,如下:
<mx:Application creationComplete="callLater(init)"
我们在creationComplete事件里,使用callLater(init)来调用init,那么再init中调用stage就不是null了
2. 主要是如果stage为null则添加Event.ADDED_TO_STAGE事件的监听,就ok了
如下