2011-12-14 2 views
9

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

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

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

Дальнейшие исследования заставили меня поверить, что начальное состояние Skin теперь 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» во время выполнения

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

public dynamic class MyClass extends Array { } 

Ошибка при установке.

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

+0

Я тоже это принял, я предполагаю, что это ошибка. Как я вижу, если вы пытаетесь получить доступ к частям кожи до того, как компонент инициализируется. Мое «решение» заключается в доступе к сайтам в следующем кадре с использованием callLater() – sydd

+0

@sydd. Я не думаю, что это ошибка. Это последовательное изменение в структуре, и я хочу узнать больше об этом. Если вы хотите знать, когда доступен скинпарт, просто переопределите 'partAdded()'. Использование callLater() не совсем красиво. – RIAstar

+0

@RIAstar Вы когда-нибудь находили решение? У меня есть некоторые существенные проблемы с обновлением до 4.6 из 4.5 (как [подробно описано здесь] (http://stackoverflow.com/questions/11840098/upgrading-to-flex-4-6-from-flex-4-5)) и это было бы абсолютно сделать мой день, если бы у вас было некоторое понимание. – NoobsArePeople2

ответ

2

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

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

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

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

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

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

+0

1) Как я вижу: он разбивает мой код, так что это серьезное изменение. Очевидно, что в инициализации компонентов выполняется другой порядок. Инструмент diff - хороший совет, но журнал изменений, который я могу просто прочитать, будет намного приятнее. Я только что нашел [один для Flex 4.5] (http://opensource.adobe.com/wiki/display/flexsdk/Flex+4.5+Backwards+Compatibility), но ничего для 4.6 – RIAstar

+0

2) Нет ничего другого в мой код ': мой код точно так же, как я написал его в моем вопросе (просто класс, расширяющий массив без дополнительных функций). Единственное, что изменилось между двумя версиями, это компилятор. – RIAstar

+0

Я сделал еще несколько тестов на nr.2, и похоже, что это была ошибка, которая теперь исправлена. Это, как вы описали, - никогда не было возможно сделать то, что я сделал. Тем не менее, это было так. – RIAstar