Изменения жизненного цикла Spark между Flex 4.5 и 4.6 - PullRequest
9 голосов
/ 14 декабря 2011

Я недавно перенес некоторые из своих проектов в новый Flex 4.6 SDK.Я не ожидал много неприятностей, так как это был только незначительный выпуск.Но на самом деле я получил сотни ошибок повсюду.Эти ошибки в основном исходят от Spark SkinnableComponent s;например:

override protected function getCurrentSkinState():String {
    return mySkinPart.someProperty ? "normal" : "someOtherState";
}

будет отлично работать под 4,5, но выдаст мне ошибку nullpointer в 4.6.Причина достаточно проста: в 4.6 getCurrentSkinState() вызывается до создания скинов, тогда как в 4.5 я мог быть уверен, что скины в состоянии по умолчанию будут там.

Дальнейшие исследования привели меня к мысли, чтоначальное состояние скина теперь undefined вместо первого состояния в массиве States (пока он не вызовет getCurrentSkinState(), то есть).

Исправление этих проблем обычно довольно легко и требует от меня лишь немного более оборонительного программирования.Но это не моя настоящая проблема.

Реальная проблема заключается в том, что если жизненный цикл компонента изменился, я бы хотел точно знать, что изменилось и какие частимои проекты могут быть затронуты.

Я был бы очень признателен, если бы кто-то мог пролить свет на это или, по крайней мере, указать мне в нужное место, где я могу прочитать все об этом (потому что единственные заметки о выпуске я могнаходка распространяется только на новые мобильные компоненты).


Редактировать (это не меняет вопроса; я просто хотел поделиться с вами своими выводами)

Другая проблема, с которой я только что столкнулся: модификатор dynamic, похоже, больше не наследуется подклассами.Это чисто проблема ActionScript, поэтому я думаю, что это компилятор, который обрабатывает его по-разному.

Позвольте мне объяснить.Рассмотрим этот класс:

public class MyClass extends Array { }

Теперь, если я попытаюсь вставить новый элемент в этот пользовательский массив следующим образом:

var t:Array = new MyClass();
t.push("hello");
  • SDK 4.5.1: нет проблем
  • SDK 4.6: «Невозможно создать свойство 0 в MyClass» во время выполнения

Очевидно, это потому, что массив является динамическим, а MyClass - нет, поэтому его легко исправить:

public dynamic class MyClass extends Array { }

и ошибка исчезла.

Но что, если бы я использовал стороннюю библиотеку с таким кодом, к которой у меня не было доступа к исходному коду?Мое приложение сломалось, и я никак не мог это исправить.Я имею в виду: давай, это не незначительное изменение для точечного релиза.

1 Ответ

2 голосов
/ 29 января 2012

Я думаю, что там есть два вопроса.

1) Реальная проблема заключается в том, что если бы жизненный цикл компонента изменился, я бы хотелось бы точно знать, что изменилось и какие части моих проектов может быть затронуто.

Я не видел всеобъемлющего низкоуровневого анализа различий между двумя версиями. Если вы действительно обеспокоены, и у вас есть свободное время, вы можете использовать инструмент сравнения для сравнения исходного кода для двух SDK. Не должно быть слишком много серьезных структурных изменений - например, переименованы классы или пакеты, так что это может быть не так плохо. Я ожидаю, что многие классы не изменились бы вообще.

2) Еще одна проблема, с которой я только что столкнулся: динамический модификатор, похоже, больше не работает наследоваться подклассами. Это чисто проблема ActionScript, поэтому я думаю, это компилятор, который обрабатывает его по-другому.

Этот проще. dynamic никогда не наследовалось. Object является динамическим, поэтому, если атрибут был унаследован, каждый класс тоже должен быть динамическим.

Если в поведении, связанном с экземплярами динамического класса, наблюдается изменение, то в вашем коде происходит что-то еще.

...