Расширение PopUpButton и его использование в веб-приложении Flex 4

В моем веб-приложении Flex 4.6 я использую в основном компоненты spark, но есть и mx-компонент — PopUpButton расширен мной (исходный код ниже).

Пользователи сообщают о проблемах с этой кнопкой, но я не могу их воспроизвести уже несколько недель.

Я попытался заменить прикрепленный к нему mx:Menu на s:List, но это ничего не изменило. Я подозреваю, что есть «исключение нулевого указателя» или какой-то другой сбой, который я не сталкиваюсь при тестировании себя...

Мой вопрос: почему Flash Builder выдает предупреждение о моей настраиваемой кнопке, как если бы ее методы были частными или отсутствовали?

введите здесь описание изображения

Может ли кто-нибудь определить причину?

Мой основной файл App.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Application  
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    xmlns:comps="*">

    <fx:Script>
        <![CDATA[
                   _auxBtn.update(obj.aux);
                    ......
                   _auxBtn.disable();
        ]]>
    </fx:Script>

    <comps:AuxButton id="_auxBtn" enabled.normal="false" enabled.ingame="false" aux="handleAux(event)" />

Моя пользовательская кнопка AuxButton.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:PopUpButton
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx"
    popUp="{_list}"
    initialize="init(event)">

    <fx:Metadata> 
        [Event(name="aux", type="PrefEvent")] 
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;
            import mx.utils.ObjectUtil;
            import spark.components.List;

            private const EXACT:String = 'Своя игра';
            private const REVEAL:String = 'Показать';

            private var _str:String;

            [Bindable]
            private var _data:ArrayCollection = new ArrayCollection();

            [Bindable]
            private var _list:List = new List();

            private function init(event:FlexEvent):void {
                _list.dataProvider = _data;
                _list.addEventListener('click', handleList);
                addEventListener('click', handleClick);
            }

            public function update(aux:Array):void {
                var found:Boolean;

                // nothing has changed
                if (ObjectUtil.compare(_data.source, aux, 0) == 0)
                    return;

                if (aux == null || aux.length == 0) {
                    disable();
                    return;
                }

                _data.removeAll();
                for each (var obj:Object in aux) {
                    _data.addItem(obj);

                    if (!_str) {
                        if (EXACT == obj['label']) {
                            _str  = obj['event'];
                            label = obj['label'];
                            found = true;
                        } else if (REVEAL == obj['label']) {
                            _str  = obj['event'];
                            label = obj['label'];
                            found = true;
                        }
                    } else if (_str == obj['event']) {
                            found = true;
                    }
                }

                if (!found) {
                    _str  = _data[0].event;
                    label = _data[0].label;
                }

                enabled = true;
            }

            private function handleList(event:MouseEvent):void {
                var index:int = _list.selectedIndex;
                if (index >= 0 && index < _data.length) {
                    _str  = _data[index].event;
                    label = _data[index].label;
                }
                close();
            }           

            private function handleClick(event:MouseEvent):void {
                dispatchEvent(new PrefEvent(PrefEvent.AUX, _str));
                disable();
            }

            public function disable():void {
                _data.removeAll();
                enabled = false;
                _str    = null;
                label   = '';
            }
        ]]>
    </fx:Script>
</mx:PopUpButton>

person Alexander Farber    schedule 16.03.2012    source источник
comment
Я скопировал ваш код в новый проект и не получил предупреждений. Я не думаю, что с кодом, который вы разместили, что-то не так. Пробовали ли вы удалять фрагменты своего приложения, пока предупреждения не исчезнут? Это может помочь вам отследить, где на самом деле проблема.   -  person Wesley Petrowski    schedule 17.03.2012
comment
Также может быть, что предупреждения являются ложными - у меня было много странных вещей, которые исчезли после очистки проекта.   -  person Wesley Petrowski    schedule 17.03.2012


Ответы (1)


Не беспокойтесь о предупреждениях Flash Builder, иногда у него возникают трудности с анализом пользовательского расширенного кода mx (иногда даже искры!). Если он работает, все в порядке, предупреждения в конечном итоге исчезнут после очистки или перезапуска FB.

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

Будьте уверены, я вставил ваш код в свой Flash Builder (и удалил PrefEvent), на моем компьютере вообще нет предупреждений :)

Для ошибки, о которой вы сообщаете пользователям, вы должны предоставить нам более подробную информацию, чтобы мы могли попытаться помочь.

Ваше здоровье

person a.s.t.r.o    schedule 16.03.2012
comment
Спасибо, приятно получить информацию от других пользователей Flash Builder. - person Alexander Farber; 17.03.2012