flex-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mihai Chira (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (FLEX-33311) Nullpointer in ConstraintLayout when executing Transition on content
Date Sat, 13 Aug 2016 11:43:22 GMT

     [ 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"
>     </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

View raw message