2011-12-14 14 views
9

Niedawno zmigrowałem niektóre z moich projektów do nowego, błyszczącego pakietu SDK Flex 4.6. Nie spodziewałem się większych kłopotów, ponieważ było to tylko niewielkie wydanie. Ale w rzeczywistości mam setki błędów w każdym miejscu. Błędy te najczęściej pochodzą od Sparka SkinnableComponent s; na przykład:Zmiany cyklu życia Sparka między wersjami 4.5 i 4.6

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

będzie działać dobrze pod 4,5, ale rzucał mi błąd nullpointer w pkt 4.6. Powód jest prosty: w 4,6 getCurrentSkinState() jest wywoływany przed tworzeniem części skórnych, podczas gdy w 4,5 mogę być pewny, że partie skóry w stanie domyślnym będą tam obecne.

Dalsze badania doprowadziły mnie do przekonania, że ​​początkowy stan skóra jest teraz undefined zamiast pierwszego stanu w tablicy States (aż wywołuje getCurrentSkinState() to jest).

Naprawianie tych problemów jest zwykle dość łatwe i wymaga nieco bardziej defensywnego programowania z mojej strony. Ale to nie jest mój prawdziwy problem.

Prawdziwym problemem jest, że jeśli składnik cyklu zmieniła, chciałbym wiedzieć dokładnie co się zmieniło i jakie części moich projektów może być ograniczona.

Byłbym bardzo wdzięczny, gdyby ktoś mógł rzucić trochę światła na to lub przynajmniej wskazać mi właściwe miejsce, w którym mogę przeczytać wszystko na ten temat (ponieważ jedyne informacje o wydaniu, które mogłem znaleźć, obejmowały tylko nowe komponenty mobilne) .


Edit (nie zmienia to pytanie, a ja po prostu chciałem podzielić się z wami moimi odkryciami)

Kolejny problem, po prostu wpadł: modyfikator dynamic wydaje się nie być dziedziczone przez podklasy. Jest to czysty problem z kodem ActionScript, więc domyślam się, że to kompilator traktuje go inaczej.

Pozwól mi wyjaśnić. Rozważmy taką klasę:

public class MyClass extends Array { } 

Teraz, gdy próbuję pchania nowy element do tej niestandardowej Array jak to:

var t:Array = new MyClass(); 
t.push("hello"); 
  • SDK 4.5.1: bez problemu
  • SDK 4.6: "Nie można utworzyć właściwości 0 w MyClass" w środowisku wykonawczym

Wygląda na to, że macierz jest dynamiczna, a MyClass nie jest, więc jest łatwo naprawiono:

public dynamic class MyClass extends Array { } 

i błąd zniknął.

Ale co, jeśli użyłem biblioteki innej firmy, która ma taki kod i do której nie miałem dostępu do kodu źródłowego? Moja aplikacja się zepsułaby i nie da się tego naprawić. Mam na myśli: chodź, to nie jest drobna zmiana w wydaniu kropki.

+0

Rozwinąłem to również, zakładam, że to błąd. Jak widzę, jeśli próbujesz uzyskać dostęp do części karnacji przed inicjalizacją komponentu. Moim "rozwiązaniem" jest uzyskanie dostępu do partii w następnej klatce za pomocą callLater() – sydd

+0

@sydd Nie sądzę, że to błąd. Jest to konsekwentna zmiana w strukturze i chcę wiedzieć więcej na jej temat. Jeśli chcesz się dowiedzieć, kiedy część skóry jest dostępna, wystarczy zastąpić 'partAdded()'. Korzystanie z funkcji callLater() nie jest całkiem ładne. – RIAstar

+0

@RIAstar Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Mam kilka istotnych problemów z aktualizacją do 4.6 z 4.5 (jak [szczegółowe tutaj] (http://stackoverflow.com/questions/11840098/upgrading-to-flex-4-6-from-flex-4-5)) i to absolutnie sprawiłoby, że mój dzień, gdybyś miał wgląd. – NoobsArePeople2

Odpowiedz

2

Myślę, że są tam dwa pytania.

1) Prawdziwym problemem jest to, że jeśli cyklem życia komponentu nie zmieniło, ja bym chciałbym wiedzieć dokładnie, co się zmieniło i jakie części moich projektów może ulegać zmianie.

Nie widziałem kompleksowej analizy niskiego poziomu różnic między dwiema wersjami. Jeśli jesteś naprawdę zaniepokojony i masz czas do stracenia, możesz użyć narzędzia porównującego do porównania kodu źródłowego dla dwóch SDK-ów. Nie powinno być zbyt wielu poważnych zmian strukturalnych - np. zmieniono nazwy klas lub pakietów, więc może nie być tak źle. Spodziewam się, że wiele zajęć w ogóle się nie zmieni.

2) Inną kwestią Właśnie wpadł: dynamiczny modyfikatora wydaje się już nie być dziedziczone przez podklasy. Jest to czysty problem z kodem ActionScript, więc domyślam się, że to kompilator traktuje go inaczej.

Ten jest łatwiejszy. dynamic nigdy nie był dziedziczony. Object jest dynamiczny, więc jeśli atrybut byłby dziedziczony, każda klasa również musiałaby być dynamiczna.

Jeśli wydaje się, że nastąpiła zmiana w zachowaniu związanym z dynamicznymi instancjami klasy, w kodzie jest coś jeszcze.

+0

1) Jak widzę: to łamie mój kod, więc to poważna zmiana. Rzeczy są wyraźnie wykonywane w innej kolejności podczas inicjowania komponentów. Narzędzie diff to dobra wskazówka, ale dziennik zmian, który mogę przeczytać, byłby o wiele lepszy. Właśnie znalazłem [jeden dla Flex 4.5] (http://opensource.adobe.com/wiki/display/flexsdk/Flex+4.5+Backwards+Compatibility), ale nic dla 4.6 – RIAstar

+0

2) Nie ma "nic więcej się w mój kod ": mój kod jest dokładnie tak, jak napisałem to w moim pytaniu (tylko klasa rozszerzająca Array bez dodatkowej funkcjonalności). Jedyną rzeczą, która zmieniła się między tymi dwiema wersjami, jest kompilator. – RIAstar

+0

Zrobiłem więcej testów na nr.2 i wyglądałoby na to, że to błąd, który został naprawiony. To - jak można to opisać - nigdy nie było możliwe zrobić to, co zrobiłem. Niemniej jednak tak było. – RIAstar

Powiązane problemy