incubator-flex-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Maxime Cowez (JIRA)" <j...@apache.org>
Subject [jira] [Created] (FLEX-33311) Nullpointer in ConstraintLayout when executing Transition on content
Date Mon, 17 Dec 2012 16:37:30 GMT
Maxime Cowez created FLEX-33311:
-----------------------------------

             Summary: Nullpointer in ConstraintLayout when executing Transition on content
                 Key: FLEX-33311
                 URL: https://issues.apache.org/jira/browse/FLEX-33311
             Project: Apache Flex
          Issue Type: Bug
          Components: Spark: Layout, Transitions
    Affects Versions: Apache Flex 4.8 (parity release)
            Reporter: Maxime Cowez
            Priority: Trivial


In some very specific cases `ConstraintLayout` will throw a nullpointer error when a component
inside it is playing a transition. I tried a few things and found out that:  
 - `parseConstraints()` creates a new `rowBaselines` Vector (or empties it if it exists)
 - some other process calls `clearConstraintCache()` in the middle of the execution of `parseConstraints()`,
setting `rowBaselines` back to `null`
 - `parseConstraints()` calls `parseElementConstraints()` which tries to access elements in
`rowBaselines` and throws a nullpointer error

I know very little about how Effects and Transitions work, so the "some other process" part
is a bit of a mistery to me.

Here is some code to reproduce the error consistently. My apologies for the complexity, but
I couldn't get a simpler example to trigger the error.

    <s:Group width="100%">
        <s:layout>
            <s:ConstraintLayout>
                <s:constraintColumns>
                    <s:ConstraintColumn id="sequenceCol"/>
                    <s:ConstraintColumn id="labelCol"/>
                    <s:ConstraintColumn id="contentCol" width="100%"/>
                    <s:ConstraintColumn id="helpCol" maxWidth="200"/>
                </s:constraintColumns>
                <s:constraintRows>
                    <s:ConstraintRow id="row1" baseline="maxAscent:10" height="100%"/>
                </s:constraintRows>
            </s:ConstraintLayout>
        </s:layout>

        <s:Group left="contentCol:0" right="contentCol:1" baseline="row1:0" bottom="row1:10">
            <t:SpecifiableListWrapper width="100%" skinClass="SpecifiableListWrapperHorizontalSkin">
                <s:DropDownList dataProvider="{dp}"/>
            </t:SpecifiableListWrapper>
        </s:Group>

        <s:Group id="helpContentGroup" left="helpCol:27" right="helpCol:10" bottom="row1:10"
baseline="row1:0"/>
    </s:Group>

As you may notice, the constraint columns and rows are a copy of those used in FormItemSkin.
I left only the content columns necessary to trigger the error (yup, remove the `helpContentGroup`
and the error's gone). SpecifiableListWrapper is a custom component which I will attach, along
with the specific skin that has the Transition that triggers the error.

Workaround: subclass ConstraintLayout (or FormItemLayout), override `measure()`, put a try/cacth
block around it and use this custom layout.

public class FormItemLayout extends spark.layouts.FormItemLayout {

    override public function measure():void {
        try {
            super.measure();
        }
        catch (e:Error) { }
    }

}

Not exactly pretty but it works without apparent side effects.


Quick fix (but probably not the ideal solution): just test whether `rowBaselines` exists before
trying to access it >

if (rowBaselines && rowBaselines[bIndex][1]) ...
instead of 
if (rowBaselines[bIndex][1]) ...

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message