DLToolkit.Forms.Controls icon indicating copy to clipboard operation
DLToolkit.Forms.Controls copied to clipboard

System.NullReferenceException using FlowListView inside a FlexLayout when navigating back to previous view

Open chrisjcoan opened this issue 6 years ago • 3 comments

Exception

System.Exception: Cannot destroy App.Views.Page. ---> System.NullReferenceException: Object reference not set to an instance of an object at Xamarin.Forms.FlexLayout.OnChildPropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs e) [0x00052] in D:\a\1\s\Xamarin.Forms.Core\FlexLayout.cs:347 at (wrapper delegate-invoke) <Module>.invoke_void_object_PropertyChangedEventArgs(object,System.ComponentModel.PropertyChangedEventArgs) at Xamarin.Forms.BindableObject.OnPropertyChanged (System.String propertyName) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:150 at Xamarin.Forms.Element.OnPropertyChanged (System.String propertyName) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:370 at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindableObject+BindablePropertyContext context, System.Object value, System.Boolean currentlyApplying, Xamarin.Forms.Internals.SetValueFlags attributes, System.Boolean silent) [0x00114] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:623 at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes, Xamarin.Forms.BindableObject+SetValuePrivateFlags privateAttributes) [0x0015b] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:417 at Xamarin.Forms.BindingExpression.ApplyCore (System.Object sourceObject, Xamarin.Forms.BindableObject target, Xamarin.Forms.BindableProperty property, System.Boolean fromTarget) [0x00225] in D:\a\1\s\Xamarin.Forms.Core\BindingExpression.cs:173 at Xamarin.Forms.BindingExpression.Apply (System.Object sourceObject, Xamarin.Forms.BindableObject target, Xamarin.Forms.BindableProperty property) [0x0006b] in D:\a\1\s\Xamarin.Forms.Core\BindingExpression.cs:78 at Xamarin.Forms.Binding.Apply (System.Object context, Xamarin.Forms.BindableObject bindObj, Xamarin.Forms.BindableProperty tar getProperty, System.Boolean fromBindingContextChanged) [0x00057] in D:\a\1\s\Xamarin.Forms.Core\Binding.cs:130 at Xamarin.Forms.BindableObject.ApplyBindings (System.Boolean skipBindingContext, System.Boolean fromBindingContextChanged) [0x0003c] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:448 at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject bindable, System.Object value) [0x0005a] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:135 at Xamarin.Forms.Element.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:504 at Xamarin.Forms.Element.<OnBindingContextChanged>b__78_0 (Xamarin.Forms.BindableObject child, System.Object bc) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:324 at Xamarin.Forms.BindableObjectExtensions.PropagateBindingContext[T] (Xamarin.Forms.BindableObject self, System.Collections.Generic.IList1[T] children, System.Action2[T1,T2] setChildBindingCo ntext) [0x0002c] in <81ae0eb290e24f558e192928e3e37a57>:0 at Xamarin.Forms.Element.OnBindingContextChanged () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:322 at Xamarin.Forms.View.OnBindingContextChanged () [0x0000c] in D:\a\1\s\Xamarin.Forms.Core\View.cs:158 at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject bindable, System.Object value) [0x00062] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:136 at Xamarin.Forms.Element.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:504 at Xamarin.Forms.Element.<OnBindingContextChanged>b__78_0 (Xamarin.Forms.BindableObject child, System.Object bc) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:324 at Xamarin.Forms.BindableObjectExtensions.PropagateBindingContext[T] (Xamarin.Forms.BindableObject self, System.Collections.Generic.IList1[T] children, System.Action2[T1,T2] setChildBindingContext) [0x0002c] in <81ae0eb 290e24f558e192928e3e37a57>:0 at Xamarin.Forms.Element.OnBindingContextChanged () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:322 at Xamarin.Forms.View.OnBindingContextChanged () [0x0000c] in D:\a\1\s\Xamarin.Forms.Core\View.cs:158 at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject bindable, System.Object value) [0x00062] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:136 at Xamarin.Forms.Element.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:504 at Xamarin.Forms.TemplatedPage.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00008] in D:\a\1\s\Xamarin.Forms.Core\TemplatedPage.cs:35 at Xamarin.Forms.Element.<OnBindingContextChanged>b__78_0 (Xamarin.Forms.BindableObject child, System.Object bc) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:324 at Xamarin.Forms.BindableObjectExtensions.PropagateBindingContext[T] (Xamarin.Forms.BindableObject self, System.Collections.Generic.IList1[T] children, System.Action2[T1,T2] setChildBindingContext) [0x0002c] in <81ae0eb290e24f558e192928e3e37a57>:0 at Xamarin.Forms.Element.OnBindingContextChanged () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:322 at Xamarin.Forms.Page.OnBindingContextChanged () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Page.cs:214 at Xamarin.Forms.ContentPage.OnBindingContextChanged () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\ContentPage.cs:16 at Xamarin.Forms.BindableObject.BindingContextPropertyChanged (Xamarin.Forms.BindableObject bindable, System.Object oldvalue, System.Object newvalue) [0x0000f] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:468 at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindableObject+BindablePropertyContext context, System.Object value, System.Boolean currentlyApplying, Xamarin.Forms.Internals.SetValueFlags attributes, System.Boolean silent) [0x00120] i n D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:625 at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes, Xamarin.Forms.BindableObject+SetValuePrivateFlags privateAttributes) [0x0015b] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:417 at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value, System.Boolean fromStyle, System.Boolean checkAccess) [0x0003d] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:573 at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:99 at Xamarin.Forms.BindableObject.set_BindingContext (System.Object value) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:25 at Prism.Common.PageUtilities.DestroyPage (Xamarin.Forms.Page page) [0x0003c] in D:\a\1\s\Source\Xamarin\Prism.Forms\Common\PageUtilities.cs:46 --- End of inner exception stack trace --- at Prism.Common.PageUtilities.DestroyPage (Xamarin.Forms.Page page) [0x00046] in D:\a\1\s\Source\Xamarin\Prism.Forms\Common\PageUtilities.cs:50 at Prism.Common.PageUtilities.HandleSystemGoBack (Xamarin.Forms.Page previousPage, Xamarin.Forms.Page currentPage) [0x0002f] in D:\a\1\s\Source\Xamarin\Prism.Forms\Common\PageUtilities.cs:225 at Prism.Behaviors.NavigationPageSystemGoBackBehavior.NavigationPage_Popped (System.Object sender, Xamarin.Forms.NavigationEventArgs e) [0x00008] in D:\a\1\s\Source\Xamarin\Prism.Forms\Behaviors\NavigationPageSystemGoBackBehavior.cs:25 at Xamarin.Forms.NavigationPage+<Xamarin-Forms-INavigationPageController-RemoveAsyncInner>d__69.MoveNext () [0x00118] in D:\a\1\s\Xamarin.Forms.Core\NavigationPage.cs:309 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00037] in /Library/Frameworks/Xamarin.iO The app has been terminated.

XAML

<FlexLayout Direction="column">
    <flv:FlowListView
                    Margin="10"
                    SeparatorVisibility="None"
                    HasUnevenRows="False"
                    HeightRequest="{Binding JobPhotos.FlowListHeight}"
                    RowHeight="{Binding JobPhotos.PhotosHeight}"
                    FlowItemsSource="{Binding JobPhotos.Photos}"
                    FlowColumnCount="{Binding JobPhotos.FlowListColumns}">
                    <flv:FlowListView.FlowColumnTemplate>
                        <DataTemplate>
                            <Image
                                Margin="10"
                                Source="{Binding ImageUrl}"
                                Aspect="AspectFill" />
                        </DataTemplate>
                    </flv:FlowListView.FlowColumnTemplate>
                </flv:FlowListView>
</FlexLayout>

chrisjcoan avatar Nov 15 '18 10:11 chrisjcoan

There is Prism also Try to remove bindings one by one to find out which binding the cause of error and then check this binding

vlkam avatar Nov 15 '18 10:11 vlkam

I've tried removing the bindings and the app still crashes.

If I change the FlexLayout to a StackLayout, everything works fine. It's something to do with trying to set the WidthRequest OnChildPropertyChanged in the FlexLayout.cs when the view is being destroyed.

chrisjcoan avatar Nov 15 '18 11:11 chrisjcoan

OK...it seems to be when the FlowListView is a child of a FlexLayout that the issue occurs. The issue is iOS specific and I can replicate it for both release and debug builds.

My current workaround is to wrap my FlowListView with a StackLayout so that the StackLayout is the child of the FlexLayout. This now works and the app no longer crashes.

chrisjcoan avatar Nov 15 '18 11:11 chrisjcoan