[ https://issues.apache.org/jira/browse/FLEX-33311?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Mihai Chira updated FLEX-33311: ------------------------------- Priority: Major (was: Trivial) > 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 > Fix For: Apache Flex 4.9.0 > > Attachments: SpecifiableListWrapper.as, > SpecifiableListWrapperHorizontalSkin.mxml > > > 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 was sent by Atlassian JIRA (v6.3.4#6332)