es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Xamarin Forms: Problema de objeto descartado con un renderizador de Android.

Utilizando un redenderizador de Android para un Marco dentro de una página en Xamarin Forms, necesito cambiar la posición de este objeto después de la asignación de tamaño de la página.
La página está en una pestaña en un Shell, cuando cambio de pestañas y vuelvo, obtengo la excepción ‘No se puede acceder a un objeto desechado’ en el redenderizador.

La excepción ocurre en esta línea de código de UpdatePos:

SetY(20);

Mi problema se ha reproducido con el siguiente código:
“`C#
//La página:
public partial class TestPage : ContentPage
{
public partial class Container : Frame
{
public delegate void PosChangedEvent();
public event PosChangedEvent HandlerPosUpdated;
public void Update()
{
HandlerPosUpdated?.Invoke();
}
}
Container _container = null;
public TestPage()
{
InitializeComponent();
_container = new Container()
{
Content = new myView()
};
main_layout.Children.Add(_container);
}
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
_container.Update();
}
}

//El renderizador:
public class ContainerRenderer : ViewRenderer<frame, android.views.view="">
{
public ContainerRenderer(Context context) : base(context)
{}
public void UpdatePos()
{
SetY(20); // System.ObjectDisposedException: 'No se puede acceder a un objeto desechado. Nombre del objeto: 'ContainerRenderer'.'

<pre><code>}
protected override void OnElementChanged(ElementChangedEventArgs<frame> e)
{
base.OnElementChanged(e);

if (e.NewElement != null)
{
TestPage.Container view = e.NewElement as TestPage.Container;
if (view != null)
{
view.HandlerPosUpdated += UpdatePos;
}
}
if (e.OldElement != null)
{
TestPage.Container view = e.OldElement as TestPage.Container;
if (view != null)
{
view.HandlerPosUpdated -= UpdatePos;
}
}
}
</code></pre>

}
“`

¿Cómo se puede evitar esta excepción?

¡Cualquier sugerencia es bienvenida!</frame,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La excepción se puede evitar comprobando si el renderizador se ha descartado antes de acceder a él. Para hacer esto, puedes agregar el siguiente código al método UpdatePos:

    if (!IsDisposed)
    {
        SetY(20);
    }
    

    Esto evitará que el renderizador acceda a un objeto descartado y cause la excepción.

Comments are closed.