Flex 4.5和4.6之间的Spark生命周期变化

9

我最近将我的一些项目迁移到了崭新的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 { }

然后错误就消失了。

但是如果我使用了一个第三方库,它包含像这样的代码,而且我无法访问源代码怎么办?我的应用程序将会崩溃,并且我没有任何办法来修复它。我的意思是:拜托,对于一个点版本来说,这可不是什么小变化。


我也遇到过这个问题,我认为这是一个bug。据我所见,如果在组件初始化之前尝试访问皮肤部件,则会出现此问题。我的“解决方案”是使用callLater()在下一帧中访问皮肤部件。 - sydd
@sydd 我认为这不是一个错误。这是框架中的一致性变化,我想更多地了解它。如果您想知道何时可用皮肤部件,请覆盖 partAdded()。使用 callLater() 不是很好看。 - RIAstar
@RIAstar,你有没有找到解决办法?我在从4.5更新到4.6时遇到了一些重大问题(详见此处),如果你有什么见解,那绝对会让我的一天变得更美好。 - NoobsArePeople2
@NoobsArePeople2 我已经成功解决了我在问题中描述的所有问题(只是通过在getCurrentSkinState()中避免使用skinparts来避免空指针),但我不确定你遇到的是否是同样的问题。 - RIAstar
1个回答

2

我认为这里有两个问题。

1)关键问题是,如果组件生命周期已经变化,我想确切地知道发生了什么变化以及我的项目的哪些部分可能会受到影响。

我没有看到对这两个版本之间差异的全面低级别分析。如果你真的很担心,并且有时间可以用一个diff工具来比较这两个SDK的源代码。不应该有太多重大的结构性变化,例如命名类或包,所以情况可能不会那么糟糕。我预计许多类根本没有改变。

2)我遇到的另一个问题是:动态修饰符似乎不再被子类继承。这是一个纯ActionScript问题,所以我猜测编译器对其的处理方式不同。

这个问题更容易解决。 dynamic 从未被继承过。 Object 是动态的,因此如果属性被继承,每个类都必须是动态的。

如果出现了与动态类实例相关的行为变化,那么在你的代码中肯定有其他问题。


依我看:它破坏了我的代码,所以这是一项重大改变。在组件初始化时,事情显然以不同的顺序执行。差异工具是一个好建议,但我可以直接阅读的更好的更新日志会更好。我刚刚发现了Flex 4.5的一个,但没有找到4.6的。 - RIAstar
2)我的代码里没有“其他事情要做”:我的代码跟我在问题中描述的完全一致(只是一个扩展了 Array 没有添加其他功能的类)。两个版本之间唯一改变的是编译器。 - RIAstar
我对第二个问题进行了更多测试,现在看来这实际上是一个错误,已经修复了。就像你所描述的那样,我所做的事情本不可能发生。尽管如此,它还是发生了。 - RIAstar
有趣。你测试的是哪个版本的SDK?我只能看到预期的行为。 - Peter Hall
4.5.1 有趣的是:我可以使用 push,我可以使用 pop,我可以使用 for each 循环进行迭代,在 push 后,FB 调试器显示属性 0 及其值。但是当我尝试通过 myArray[0] 访问它甚至只是跟踪数组时(跟踪隐式调用 toString,该方法调用 join,这是失败的方法),我会收到错误。在 4.6 中,当我 push 时立即失败,就像应该做的那样。 - RIAstar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接