Alexander Farber
Alexander Farber

Reputation: 22998

Extending PopUpButton and using it in a Flex 4 web application

In my Flex 4.6 web application I use mainly spark components, but there is also an mx-component - a PopUpButton extended by me (the source code is below).

Users report problems with that button, but I can't reproduce any - since weeks.

I've tried replacing mx:Menu attached to it by a s:List but it hasn't changed anything. I suspect there is a "null pointer exception" or some other failure, that I don't hit when testing myself...

My question is: why does Flash Builder reports warning about my custom button as if its methods would be private or not present?

enter image description here

Can anybody please spot the reason?

My main 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)" />

My custom button 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>

Upvotes: 1

Views: 591

Answers (1)

a.s.t.r.o
a.s.t.r.o

Reputation: 3338

Don't worry about Flash Builder warnings, sometimes it has difficulties analyzing custom mx extended code (even spark sometimes!). If it runs it's okay, warnings will eventually go away after a clean or a FB restart.

You can also try to reproduce same feature using a mix of spark component, depending on a feature, it is maybe the best thing to do.

Stay assured, I pasted your code in my Flash Builder (and removed the PrefEvent), there are no warnings at all on my computer :)

For the error you users are reporting, you should give us more detail so we can try to help.

Cheers

Upvotes: 1

Related Questions