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.

La configuración de la propiedad IsVisible de FlyOutItem en False provoca un bloqueo de la aplicación en iOS 14.5.

El siguiente es un fragmento de FlyoutItem donde el elemento debe mostrarse si el usuario ha iniciado sesión. El proceso de inicio de sesión establece ShowAuthorizedRoutes como verdadero si el proceso de inicio de sesión es exitoso.

<flyoutitem title="Resumen de Beneficios" isvisible="{Binding ShowAuthorizedRoutes}">
    <shellcontent route="BenefitsSummary" contenttemplate="{DataTemplate local:BenefitsSummaryPage}"></shellcontent>
    <flyoutitem.flyouticon>
        <fontimagesource fontfamily="FontAwesome5154Solid" glyph="{x:Static fontAwesome:FontAwesomeIcons.DollarSign}" color="{x:StaticResource Secondary}" size="Medium">
        </fontimagesource>
    </flyoutitem.flyouticon>
</flyoutitem>

El fragmento anterior muestra uno de los elementos de Flyout en la Shell. Hay un total de 7 elementos en la Shell. Son idénticos, excepto por el icono, la ruta y la plantilla. Los últimos 2 elementos no están asegurados. Por lo tanto, no están vinculados a ShowAuthorizedRoutes. Por lo tanto, la visibilidad de 5 elementos debe alternarse.

Cuando el inicio de sesión es exitoso, todo funciona según lo esperado. Se muestran todos los elementos. Sin embargo, tan pronto como se establece ShowAuthorizedRoutes en FALSO al cerrar sesión, la aplicación se bloquea en iOS 14.5 cuando intenta ocultar los elementos asegurados.

El centro de la aplicación registra el siguiente informe de bloqueo.

“intentar eliminar la fila 5 de la sección 0, que solo contiene 2 filas antes de la actualización”

Parece que el objeto Shell está tratando de eliminar elementos ya eliminados.

Si es iOS 15 o posterior, esto funciona sin problemas. También funciona en Android (cualquier versión).

¿Hay alguna sugerencia para solucionar esto en iOS 14 o alguna solución alternativa? ¡Gracias de antemano por cualquier ayuda!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Este problema parece estar relacionado con la forma en que Xamarin.Forms maneja los elementos del flyout en iOS 14.5. Una solución alternativa que podría resolver este problema es utilizar un enfoque diferente para alternar la visibilidad de los elementos del flyout.

    En lugar de vincular la propiedad IsVisible de los elementos del flyout a ShowAuthorizedRoutes, podemos manejar la visibilidad de los elementos del flyout en el código subyacente.

    Por ejemplo, podemos crear una función llamada UpdateFlyoutItemsVisibility() que sea responsable de encontrar todos los elementos del flyout que deben alternarse (es decir, los que están vinculados a ShowAuthorizedRoutes) y actualizar su visibilidad en consecuencia.

    private void UpdateFlyoutItemsVisibility()
    {
        var flyoutItems = myShell.Items
            .Where(item => item is FlyoutItem flyoutItem && 
                (string) flyoutItem.GetValue(AutomationProperties.NameProperty) != "Cerrar sesión"
                && (string) flyoutItem.GetValue(AutomationProperties.NameProperty) != "Configuración")
            .Cast<flyoutitem>();
    
        foreach (var item in flyoutItems)
        {
            if (item.BindingContext != null && item.BindingContext is ViewModelBase vm)
            {
                item.IsVisible = vm.ShowAuthorizedRoutes;
            }
        }
    }
    

    Luego, podemos llamar a esta función siempre que cambie la propiedad ShowAuthorizedRoutes (por ejemplo, cuando el usuario inicie sesión o cierre sesión).

    private void OnShowAuthorizedRoutesChanged()
    {
        UpdateFlyoutItemsVisibility();
    }
    

    De esta manera, tenemos un mayor control sobre la visibilidad de los elementos del flyout y podemos evitar posibles problemas al actualizar los elementos del flyout en iOS 14.5.

    Tenga en cuenta que esta es solo una posible solución alternativa y puede que no sea la más eficiente o elegante. Siempre es recomendable probar exhaustivamente y considerar otras opciones antes de implementar esta u otra solución alternativa en un entorno de producción.

Comments are closed.