I've recently started to use a dynamic theme for a Xamarin.Forms app with AppThemeBinding. Unfortunately, the Pancake view crashes sometimes after first, other times after several theme switches via the system menu. I can reliably reproduce it in my Xamarin.Forms Android app. The UI is as simple as below:
<pancakeview:PancakeView BackgroundColor="{AppThemeBinding Dark={StaticResource TileBackground_Dark}, Light={StaticResource TileBackground_Light}}"> ...
The crash points to Android.Views.View.SetBackgroundColor in PancakeViewRenderer. I'm changing the theme via the context system menu (pulled from the top of the screen):
[AppCenterCrashes] System.ObjectDisposedException: Cannot access a disposed object.
[AppCenterCrashes] Object name: 'Xamarin.Forms.PancakeView.Droid.PancakeViewRenderer'.
[AppCenterCrashes] at Java.Interop.JniPeerMembers.AssertSelf (Java.Interop.IJavaPeerable self) [0x00029] in <c2283cbfa9df4045adcb3fe5939ebddf>:0
[AppCenterCrashes] at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00000] in <c2283cbfa9df4045adcb3fe5939ebddf>:0
[AppCenterCrashes] at Android.Views.View.SetBackgroundColor (Android.Graphics.Color color) [0x0001e] in /Users/builder/azdo/_work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-30/mcw/Android.Views.View.cs:22288
[AppCenterCrashes] at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].UpdateBackgroundColor () [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:491
[AppCenterCrashes] at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].OnElementPropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs e) [0x00017] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:368
[AppCenterCrashes] at Xamarin.Forms.PancakeView.Droid.PancakeViewRenderer.OnElementPropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs e) [0x00009] in <a1f8c5f59e794e2b99a9a6be6aa81de2>:0
[AppCenterCrashes] at (wrapper delegate-invoke) <Module>.invoke_void_object_PropertyChangedEventArgs(object,System.ComponentModel.PropertyChangedEventArgs)
[AppCenterCrashes] at Xamarin.Forms.BindableObject.OnPropertyChanged (System.String propertyName) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:266
[AppCenterCrashes] at Xamarin.Forms.Element.OnPropertyChanged (System.String propertyName) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:362
[AppCenterCrashes] 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:510
[AppCenterCrashes] at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes, Xamarin.Forms.BindableObject+SetValuePrivateFlags privateAttributes) [0x00173] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:446
[AppCenterCrashes] at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:383
[AppCenterCrashes] at Xamarin.Forms.AppThemeBinding.ApplyCore () [0x00018] in D:\a\1\s\Xamarin.Forms.Core\AppThemeBinding.cs:47
[AppCenterCrashes] at Xamarin.Forms.AppThemeBinding.<.ctor>b__2_1 () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\AppThemeBinding.cs:10
[AppCenterCrashes] at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in /Users/builder/azdo/_work/1/s/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36
[AppCenterCrashes] at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00008] in /Users/builder/azdo/_work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-30/mcw/Java.Lang.IRunnable.cs:90
[AppCenterCrashes] at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.39(intptr,intptr)
**System.ObjectDisposedException:** 'Cannot access a disposed object.
Object name: 'Xamarin.Forms.PancakeView.Droid.PancakeViewRenderer'.'[mono-rt] [ERROR] FATAL UNHANDLED EXCEPTION: System.ObjectDisposedException: Cannot access a disposed object.
[mono-rt] Object name: 'Xamarin.Forms.PancakeView.Droid.PancakeViewRenderer'.
[mono-rt] at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.39(intptr,intptr)
[mono-rt] at (wrapper native-to-managed) Android.Runtime.DynamicMethodNameCounter.39(intptr,intptr)
As you can see, there is no custom code in the stack trace, only the PancakeViewRenderer.
How can I fix the issue?
I've recently started to use a dynamic theme for a Xamarin.Forms app with
AppThemeBinding. Unfortunately, the Pancake view crashes sometimes after first, other times after several theme switches via the system menu. I can reliably reproduce it in my Xamarin.Forms Android app. The UI is as simple as below:<pancakeview:PancakeView BackgroundColor="{AppThemeBinding Dark={StaticResource TileBackground_Dark}, Light={StaticResource TileBackground_Light}}"> ...The crash points to
Android.Views.View.SetBackgroundColorinPancakeViewRenderer. I'm changing the theme via the context system menu (pulled from the top of the screen):As you can see, there is no custom code in the stack trace, only the
PancakeViewRenderer.How can I fix the issue?