XamarinCommunityToolkit
XamarinCommunityToolkit copied to clipboard
[Bug] Access to disposable object on Android ShadowEffect
Hello, I catch exception when using ShadowEffect.
[mono-rt] [ERROR] FATAL UNHANDLED EXCEPTION: System.ObjectDisposedException: Cannot access a disposed object.
[mono-rt] Object name: 'Xamarin.Forms.Platform.Android.ImageButtonRenderer'.
[mono-rt] at Java.Interop.JniPeerMembers.AssertSelf (Java.Interop.IJavaPeerable self) [0x00029] in <1959115d56f8444789986cf39185638c>:0
[mono-rt] at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00000] in <1959115d56f8444789986cf39185638c>:0
[mono-rt] at Android.Views.View.set_Elevation (System.Single value) [0x00018] in /Users/builder/azdo/_work/2/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-30/mcw/Android.Views.View.cs:6590
[mono-rt] at Xamarin.CommunityToolkit.Android.Effects.PlatformShadowEffect.OnDetached () [0x0000f] in <964de25b16794d918e4c00220cf2f406>:0
[mono-rt] at Xamarin.Forms.Effect.SendDetached () [0x00009] in D:\a\1\s\Xamarin.Forms.Core\Effect.cs:62
[mono-rt] at Xamarin.Forms.PlatformEffect2[TContainer,TControl].SendDetached () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\PlatformEffect.cs:23 [mono-rt] at Xamarin.Forms.RoutingEffect.SendDetached () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\RoutingEffect.cs:34 [mono-rt] at Xamarin.Forms.Element.set_EffectControlProvider (Xamarin.Forms.IEffectControlProvider value) [0x0002e] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:230 [mono-rt] at Xamarin.Forms.Internals.EffectUtilities.RegisterEffectControlProvider (Xamarin.Forms.IEffectControlProvider self, Xamarin.Forms.IElementController oldElement, Xamarin.Forms.IElementController newElement) [0x0001a] in D:\a\1\s\Xamarin.Forms.Core\Internals\EffectUtilities.cs:16 [mono-rt] at Xamarin.Forms.Platform.Android.FastRenderers.VisualElementRenderer.OnElementChanged (System.Object sender, Xamarin.Forms.Platform.Android.VisualElementChangedEventArgs e) [0x0005c] in D:\a\1\s\Xamarin.Forms.Platform.Android\FastRenderers\VisualElementRenderer.cs:102 [mono-rt] at (wrapper delegate-invoke) System.EventHandler
1[Xamarin.Forms.Platform.Android.VisualElementChangedEventArgs].invoke_void_object_TEventArgs(object,Xamarin.Forms.Platform.Android.VisualElementChangedEventArgs)
[mono-rt] at Android.Views.View.set_Elevation (System.Single value) [0x00018] in /Users/builder/azdo/_work/2/s/xamarin-android/src/Mono.Android/obj/10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.ImageButtonRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs1[TElement] e) [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\AppCompat\ImageButtonRenderer.cs:198 [mono-rt] at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context) [0x0003e] in D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:358 [mono-rt] at Xamarin.Forms.Internals.EffectUtilities.RegisterEffectControlProvider (Xamarin.Forms.IEffectCon10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren) [0x000b3] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:140 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementPackager.Load () [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:112 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementRenderer
1[TElement].SetElement (TElement element) [0x000e8] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:244
[mono-rt] at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context) [0x0003e] in D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:358
[mono-rt] at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren) [0x000b3] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:140
[mono-rt] at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualEleme10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement) [0x00163] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:351
[mono-rt] at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) 10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.VisualElementRenderer
1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) [0x00007] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:481
[mono-rt] at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetElement (TElement element) [0x000e8] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:244 [mono-rt] at Xamarin.Forms.Platform.Android.VisualElementRenderer
1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00033] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:131
[mono-rt] at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren) [0x000b3] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:140
[mono-rt] at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.Visu10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Platform.Android.VisualElementPackager.OnChildAdded (System.Object sender, Xamarin.Forms.ElementEventArgs e) [0x0000f] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:206
[mono-rt] at Xamarin.Forms.Element.OnChildAdded (Xamarin.Forms.Element child) [0x0000f] in D:\a\1\s\Xamarin.Forms.Core\Element.cs:328
[mono-rt] at Xamarin.Forms.VisualElement.OnChildAdded (Xamarin.Forms.Element child) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\VisualElement.cs:832
[mono-rt] at System.Collections.ObjectModel.ObservableCollection1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [10-23 00:35:39.848 F/mono-rt ( 9564): at Xamarin.Forms.Layout
1[T].OnChildAdded (Xamarin.Forms.Element child) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:22
[mono-rt] at Xamarin.Forms.Layout.OnInternalAdded (Xamarin.Forms.View view) [0x0001d] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:444
[mono-rt] at Xamarin.Forms.Layout.InternalChildrenOnCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00080] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:434
[mono-rt] at (wrapper delegate-invoke) <Module>.invoke_void_object_NotifyCollectionChangedEventArgs(object,System.Collections.Specialized.NotifyCollectionChangedEventArgs)
[mono-rt] at System.Collections.ObjectModel.Collection1[T].Add (T 0x00018] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:263 [mono-rt] at System.Collections.ObjectModel.ObservableCollection
1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction action, System.Object item, System.Int32 index) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:338
[mono-rt] at System.Collections.ObjectModel.ObservableCollection1[T].InsertItem (System.Int32 index, T item) [0x0001a] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:196 [mono-rt] at System.Collections.ObjectModel.Collection
1[T].Add (T item) [0x00020] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Collections/ObjectModel/Collection.cs:71
[mono-rt] at Xamarin.Forms.ObservableWrapper`2[TTrack,TRestrict].Add (TRestrict item) [0x0004b] in D:\a\1\s\Xamarin.Forms.Core\ObservableWrapper.cs:35
[mono-rt] at Xamarin.CommunityToolkit.UI.Views.StateLayoutController.SwitchToTemplate (Xamarin.CommunityToolkit.UI.Views.LayoutState state, System.String customState, System.Boolean animate) [0x0034d] in <964de25b16794d918e4c00220cf2f406>:0
[mono-rt] at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.40(intptr,intptr)
[mono-rt] at (wrapper native-to-managed) Android.Runtime.DynamicMethodNameCounter.40(intptr,intptr)
Do you have any sample repo to reproduce it easily? Diagnosing the issue with only exception is bit hard.
Hi,
I have the same problem on my app. It looks like. Problem is here:
OnDeatach is trying to set Elevation on already Disposed object:
System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Xamarin.Forms.Platform.Android.ImageButtonRenderer'.
Partial Stack Trace:
JniPeerMembers.AssertSelf (Java.Interop.IJavaPeerable self)
JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters)
View.set_Elevation (System.Single value)
PlatformShadowEffect.OnDetached ()
Effect.SendDetached ()
PlatformEffect`2[TContainer,TControl].SendDetached ()
RoutingEffect.SendDetached ()
Problem is on this class:
public class PlatformShadowEffect : PlatformEffect
Additional check for disposed object may/should resolve the problem.
protected override void OnDetached()
{
if (View == null)
return;
View.Elevation = 0;
}