суббота, мая 16, 2009

Модули, синглтоны, Type Coercion Failed и спасение

Сегодня столкнулся с такой проблемой:

Приложение использует модули. Один из модулей содержит ComboBox.
Во время работы, подгружается то один модуль, то другой. Так вот.
При первой активации, модуль с ComboBox работает корректно. Однако, при повторной активации модуля, начинаются проблемы - при нажатии на ComboBox вылетает ошибка:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать mx.managers::PopUpManagerImpl@6c0ce41 в mx.managers.IPopUpManager.

Аналогичная ошибка с компонентом List, правда немного с другими классами:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать mx.managers::DragManagerImpl@6b7ec11 в mx.managers.IDragManager.

Ужасаясь перспективе просидеть в дебаге всю ночь, полез в Гугл. И тут же нашел спасение - не один я столкнулся с таким казусом:
Flex Error #1034: Type Coercion Failed: Cannot Convert Mx.managers

Вот решение (я его оформил немного поизящнее):
Нужно в коде основного приложения указать следующую строку:
import mx.managers.*;DragManager;HistoryManager;PopUpManager;

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

23 комментария:

foreground комментирует...

А нельзя было RSL-фрэймворк использовать?

Racer комментирует...

Подробнее, пожалуйста.

foreground комментирует...

Ну просто может я туплю, но если билдить приложение с RSL фрэймворком,
потребность в таком насилии отпадёт?
Да и адобовцы, как я понял, советуют чтоб фрэймворк отдельно от
приложения лежал, чтобы кэшированный фрэймворк для других приложений
пригодился.

Racer комментирует...

Интересная тема, еще не сталкивался. Сам пробовал? Работает? Подскажешь, где найти?

ЗЫ: Не спится? :)

foreground комментирует...

Не пробовал. Потому как только присматриваюсь к этому громоздкому флексу. Но видел, что fusion, например, так делают. И мне кажется это оправдано. А моя задача сейчас попробовать компонент (или не компонент) вобщем класс, который можно было бы использовать без флекса, и с ним. Т.е. как некоторые говорят, pure AS проект.
Я увидел твой коммент по поводу UIMovieClip на http://tearaway-tea.com/blog/2008/12/%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B-%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%B0%D0%BC/ru/ и, если можно скажи, а какие подходы ты использовал если не этот?
PS: да зелёного чаю выпил ;)

foreground комментирует...

мда. . точно спать пора .. вот твой коммент http://the33cows.com/flex/2009/06/22/productivity-and-flex-component-kit/#comment-4985

Racer комментирует...

Ты имеешь в виду продвинутое скинование? Я обычно делаю просто скины (залинкованные клипы в SWF) на каждый стейт кнопки и не парюсь.
Для управления сложными анимациями, перекрываю SWFLoader и делаю в нем всё что хочу с флэшовым контентом (который принципиально не содержит никаких скриптов - всё кодится в рамках флекс-проекта).

А чтоб сделать компонент с/без флекса - просто не пользовать в нем классы флексового фреймворка.

foreground комментирует...

Не использовать классы фрэймворка, это конечно класно, но когда твоя swf подгружается во флекс (различным макаром) она должна там нормально функционировать. Несмотря на то, что всё что вокруг неё напрямую ею пользоваться не будет. Я думал ты скажешь типа надо забить на UIMovieClip, потому что можно просто самому реализовать нужные интерфейсы. Я ведь не для скинов его хочу использовать, а для интеграции.

Использование RSL линкования или билда (вощем динамическая линковка)
http://img39.imageshack.us/img39/1150/rsl.gif.

foreground комментирует...

можешь еще про скинование вот что сазать: вот когда у тебя в проекте скажем 2 комбобокса с разными скинами, как ты загрузишь скин? По умолчанию одни и те же названия ассетов используются в swc. И у меня возникала такая ситуация, когда темы просто глючили, на половину один скин, на половину видать другой. Может проблема была в доменах. .

Racer комментирует...

Странная бага. Я ты скин в CSS задавал?

foreground комментирует...

Нет скины рисованный были во флэше. Просто когда две swc использовались в одном pureAS3 проекте, получалось так, что ассеты с одинаковыми именами отчасти похеривались. Я задавал вопрос в флэш-группе. Там посоветовали загружать динамически. Но с динамикой конечно нифига не прикольно и там обнаружился еще какой-то косяк. После чего у меня срочность проекта прекратилась и я этим больше не занимался. А вобще неплохо бы знать на будущее как такое делать.

Racer комментирует...

Ну правильно, это из-за того, что они в одном домене. Если в одном домене не может быть два класса с одним именем - последующие дублирующиеся будут игнорироваться.
Чесн говоря, я вообще флэшовые swc стараюсь не использовать, поэтому особенности их глюков мне мало знакомы :).
Я думаю, что любые задачи флэшового скинирования анимирования и графики во флекс и пуреас3 можно решить SWF-ками. С swc и флэш-компонент-китом я сразу поссорился после кучи потерянного времени на баги и генерирование swc.

Racer комментирует...

Кстати можно сделать "как-бы" динамическую загрузку, загружая с помощью loadBytes флэшки, внедренные EMBED с параметром MIME="application/octet-stream". А грузить можно уже в любой домен.

Но это, наверное, не супер изящно в твоем случае.

foreground комментирует...

Вот как-раз это-то мне и посоветовали, кагбуд-то это панацея для всего. У меня с этим вариантом тоже что-то не срослось. . щас точно не скажу - забыл уже. по-моему метод он у объекта потерял. . хотя он был. Так-то конечно хорошо, что типа ассеты с одинаковыми именами будут точно включены оба. Но вот чето не так я их видать готовил.
Может есть ссылки на материал?
С флексом вроде начинает проясняться. Буду переделывать UIMovieClip скорей всего. Так чтоб получить и для AS проектов класс и для флекса, в одном лице.

Racer комментирует...

> Так чтоб получить и для AS проектов класс и для флекса, в одном лице.

А какова цель?

foreground комментирует...

цель - использовать компонента без флекса и с ним. Без него оно меньше будет весить практически на 500КБайт.

Racer комментирует...

Пользуй FlashCS-компоненты.
По-любому это будет уже не тот флекс. В этом случае нужно на какой-нть другой фреймворк вешаться. Сейчас их развелось.. Найти получше вариант. Вон, альтернативщики вроде разработали свой легкий интерфейсный фреймворк. Но у них это вроде не бесплатно.

foreground комментирует...

>Вон, альтернативщики вроде разработали свой легкий интерфейсный фреймворк. Но у них это вроде не бесплатно.

так и есть - не бесплатно.

>По-любому это будет уже не тот флекс.

из-за того, что моя компонента не UIComponent? главное чтоб нормально отрабатывала и там и там.

Racer комментирует...

То есть ты хочешь сделать аналог UIComponent, и чтобы он работал и в твоем фреймворке и во Flex?

Ну это вполне (теоретически :) ) осуществимо - главное чтоб твой компонент поддерживал интерфейс IUIComponent.

Итак, на сколько я понял, ты разрабатываешь набор компонентов, которые можно было бы пользовать в и без Flex? Первое - понятно, чтоб сократить размер, второе - чтоб в случае необходимости, задействовать мощности Flex.

На своем опыте, пока не нашел общих подходов для pureAS и Flex, ибо они совсем для разных задач. Есть набор служебных библиотек (и своих и чужих), которые помогают и там и там.

foreground комментирует...

Ну набор, не набор, а так одну пока хочу сделать. Все никак не дорвусь. Надо подучить еще лайвцикл, чтоб понять как можно писать код, а как нельзя :)

> На своем опыте, пока не нашел общих подходов

Думаю тайна зарыта в исходниках mx.flash.*, в сравнинии их с UIComponent и Container.

Racer комментирует...

Вообще, юзать флекс гораздо приятнее чем копаться в нем. Жаль что без второго, его юзание заканчивается только на приложениях типа интранет-онли :) Чтобы сделать что-то более-менее эффектное, нужно просто всё наизнанку выворачивать. Даже эффекты флексовые работают через пень-колоду, приходится их программировать вручную.
Не смотрел еще Flash Builder и каталист, там вроде что-то дельное напридумывали. Кстати, не в курсе, на них приложения под FP9 генерить можно, или не менее 10ки?

foreground комментирует...

>эффекты флексовые работают через пень-колоду, приходится их программировать вручную.

спасибо за инфу, буду иметь ввиду.

Под FP9 во флэш билдере есть 3.4sdk. Жаль что триал закончился уже.

Каталист не ставил, так как думаю оно мне без надобности будет :)

incorp комментирует...

огромное спасибо! целый день возился с этим багом и не знаю сколько бы еще времени это заняло.