2011-12-14 30 views
9

Gần đây tôi đã di chuyển một số dự án của mình sang Flex 4.6 SDK mới sáng bóng. Tôi đã không mong đợi nhiều rắc rối vì nó chỉ là một bản phát hành nhỏ. Nhưng thực tế là tôi có hàng trăm lỗi trên khắp nơi. Những lỗi này chủ yếu đến từ Spark SkinnableComponent s; ví dụ:Thay đổi vòng đời Spark giữa Flex 4.5 và 4.6

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

sẽ hoạt động tốt dưới 4.5, nhưng sẽ ném cho tôi một lỗi nullpointer trong 4.6. Lý do là đủ đơn giản: trong 4.6 getCurrentSkinState() được gọi trước khi các skinparts được tạo ra, trong khi ở 4.5 tôi có thể chắc chắn rằng skinparts trong trạng thái mặc định sẽ ở đó.

Điều tra thêm dẫn tôi tin rằng trạng thái ban đầu của da bây giờ là undefined thay vì trạng thái đầu tiên trong mảng States (cho đến khi nó gọi là getCurrentSkinState()).

Khắc phục các sự cố này thường khá dễ dàng và chỉ yêu cầu phần mềm phòng thủ nhiều hơn một phần từ phía tôi. Nhưng đó không phải là vấn đề thực sự của tôi.

Vấn đề thực sự là nếu chu kỳ thành phần đã thay đổi, tôi muốn biết chính xác những gì đã thay đổi và những phần nào của dự án của tôi có thể bị ảnh hưởng.

Tôi sẽ rất cảm kích nếu ai đó có thể làm sáng tỏ điều này hoặc ít nhất là đưa tôi đến đúng nơi mà tôi có thể đọc tất cả về nó (vì ghi chú phát hành duy nhất tôi có thể tìm thấy chỉ bao gồm các thành phần di động mới) .


Sửa (điều này không làm thay đổi câu hỏi, tôi chỉ muốn chia sẻ những phát của tôi với bạn)

Một vấn đề tôi chỉ chạy vào: modifier dynamic dường như không còn được thừa hưởng bởi các lớp con. Đây là một vấn đề ActionScript thuần túy, vì vậy tôi đoán đó là trình biên dịch xử lý nó một cách khác nhau.

Hãy để tôi giải thích. Xem xét lớp này:

public class MyClass extends Array { } 

Bây giờ, nếu tôi cố gắng đẩy một mục mới vào mảng này tùy chỉnh như thế này:

var t:Array = new MyClass(); 
t.push("hello"); 
  • SDK 4.5.1: không có vấn đề
  • SDK 4.6: "Không thể tạo thuộc tính 0 trên MyClass" tại thời gian chạy

Rõ ràng là do mảng là động và MyClass không phải là, vì vậy nó dễ dàng cố định:

public dynamic class MyClass extends Array { } 

và lỗi đã biến mất.

Nhưng nếu tôi sử dụng thư viện của bên thứ ba có mã như thế này và tôi không có quyền truy cập mã nguồn thì sao? Ứng dụng của tôi sẽ bị hỏng và không có cách nào tôi có thể sửa nó. Ý tôi là: thôi nào, đó không phải là thay đổi nhỏ đối với việc giải phóng dấu chấm.

+0

Tôi cũng đã gặp phải điều này, tôi cho rằng đó là lỗi. Như tôi thấy xảy ra, nếu bạn cố gắng truy cập các bộ phận da trước khi các thành phần là initalizes. "Giải pháp" của tôi là truy cập skinparts trong khung tiếp theo bằng cách sử dụng callLater() – sydd

+0

@sydd Tôi không nghĩ đó là lỗi. Đó là một sự thay đổi nhất quán trong khuôn khổ và tôi muốn biết thêm về nó. Nếu bạn muốn biết khi nào một skinpart có sẵn, chỉ cần ghi đè lên 'partAdded()'. Sử dụng callLater() không chính xác là đẹp. – RIAstar

+0

@RIAstar Bạn đã bao giờ tìm được giải pháp cho điều này chưa? Tôi đang gặp một số vấn đề quan trọng khi cập nhật lên 4.6 từ 4.5 (như [chi tiết tại đây] (http://stackoverflow.com/questions/11840098/upgrading-to-flex-4-6-from-flex-4-5)) và nó sẽ hoàn toàn làm cho ngày của tôi nếu bạn có một số thông tin chi tiết. – NoobsArePeople2

Trả lời

2

Tôi nghĩ có hai câu hỏi trong đó.

1) Vấn đề thực sự ở đây là nếu chu kỳ thành phần đã thay đổi, tôi muốn muốn biết chính xác những gì đã thay đổi và những phần nào của dự án của tôi có thể bị ảnh hưởng.

Tôi chưa thấy phân tích cấp độ toàn diện về sự khác biệt giữa hai phiên bản. Nếu bạn thực sự quan tâm, và bạn có thời gian rảnh rỗi, bạn có thể sử dụng một công cụ khác để so sánh mã nguồn cho hai SDK. Không nên có quá nhiều thay đổi cấu trúc chính - ví dụ: đã đổi tên các lớp hoặc gói, vì vậy nó có thể không quá tệ. Tôi mong đợi rất nhiều lớp học sẽ không thay đổi chút nào.

2) Một vấn đề khác mà tôi vừa gặp phải: công cụ sửa đổi động dường như không còn được kế thừa. Đây là một vấn đề ActionScript thuần túy, vì vậy tôi đoán đó là trình biên dịch xử lý nó một cách khác nhau.

Cái này dễ hơn. dynamic chưa bao giờ được kế thừa. Object là động, vì vậy nếu thuộc tính được kế thừa thì mọi lớp sẽ phải là động.

Nếu dường như có sự thay đổi về hành vi liên quan đến các phiên bản lớp động, thì có điều gì đó khác đang xảy ra trong mã của bạn.

+0

1) Như tôi thấy: nó phá vỡ mã của tôi, vì vậy đó là một thay đổi lớn. Mọi thứ rõ ràng đang được thực hiện theo thứ tự khác nhau khi khởi tạo thành phần. Công cụ tìm khác biệt là một mẹo hay, nhưng một thay đổi mà tôi có thể đọc được sẽ đẹp hơn rất nhiều. Tôi chỉ tìm thấy [một cho Flex 4.5] (http://opensource.adobe.com/wiki/display/flexsdk/Flex+4.5+Backwards+Compatibility), nhưng không có gì cho 4.6 – RIAstar

+0

2) Có 'không có gì khác xảy ra trong mã của tôi ': mã của tôi là chính xác như tôi đã viết nó trong câu hỏi của tôi (chỉ là một lớp mở rộng mảng không có chức năng bổ sung). Điều duy nhất đã thay đổi giữa hai phiên bản là trình biên dịch. – RIAstar

+0

Tôi đã thực hiện một số thử nghiệm khác trên nr.2 và có vẻ như đây thực sự là một lỗi hiện đã được sửa. Nó _should_ - như bạn mô tả - không bao giờ có thể làm những gì tôi đã làm. Tuy nhiên, nó đã được. – RIAstar

Các vấn đề liên quan