我最近将我的一些项目迁移到了崭新的Flex 4.6 SDK。由于这只是一个小版本发布,因此我没有期望会有太多麻烦。但实际上,我遇到了无数错误,它们分散在各个地方。这些错误主要来自Spark SkinnableComponent ; 例如:
override protected function getCurrentSkinState():String {
return mySkinPart.someProperty ? "normal" : "someOtherState";
}
会在4.5下正常工作,但会在4.6中抛出一个nullpointer错误。原因很简单:在4.6中,在创建皮肤部件之前会调用getCurrentSkinState(),而在4.5中,我可以确定默认状态的皮肤部件已经存在。
进一步的研究让我相信,皮肤的初始状态现在是未定义的,而不是States数组中的第一个状态(直到它调用getCurrentSkinState())。
修复这些问题通常很容易,只需要从我的部分进行一些更具防御性的编程即可。但这不是我的真正问题。
真正的问题是,如果组件生命周期发生了变化,我想知道到底发生了什么变化,我的项目的哪些部分可能会受到影响。
如果有人能够为我解决这个问题或者至少指点我可以阅读所有相关信息的正确位置(因为我找到的唯一版本说明只涵盖了新的移动组件),我将非常感激。
编辑(这并不改变问题;我只想与您分享我的发现)
我刚遇到的另一个问题:dynamic修改器似乎不再被子类继承。这是一个纯ActionScript问题,所以我想这是编译器处理它的方式不同。
让我解释一下。考虑这个类:
public class MyClass extends Array { }
现在,如果我试图将一个新项目推入这个自定义数组中,就像这样:
var t:Array = new MyClass();
t.push("hello");
- SDK 4.5.1: 没有问题
- SDK 4.6: 运行时出现“无法在MyClass上创建属性0”的错误
显然,这是因为Array是动态的,而MyClass不是,所以很容易解决:
public dynamic class MyClass extends Array { }
然后错误就消失了。
但是如果我使用了一个第三方库,它包含像这样的代码,而且我无法访问源代码怎么办?我的应用程序将会崩溃,并且我没有任何办法来修复它。我的意思是:拜托,对于一个点版本来说,这可不是什么小变化。
partAdded()
。使用callLater()
不是很好看。 - RIAstargetCurrentSkinState()
中避免使用skinparts来避免空指针),但我不确定你遇到的是否是同样的问题。 - RIAstar