Xamarin.Forms Page.DisplayAlert dans Page.OnAppearing

Bondoline

Je ne parviens pas à DisplayAlertafficher une fenêtre contextuelle dans le OnAppearingrappel d'un Xamarin.Forms Page. Voici ce que j'ai essayé jusqu'à présent :

protected override void OnAppearing()
{
    base.OnAppearing();

    this.DisplayAlert("Alert", "Consider yourself alerted", "OK");
}

Considérant qu'il DisplayAlerts'agit techniquement d'une asyncfonction, renvoyant un Task, j'ai également essayé ce qui suit :

protected async override void OnAppearing()
{
    base.OnAppearing();

    await this.DisplayAlert("Alert", "Consider yourself alerted", "OK");
}

Cependant, ni l'un ni l'autre ne semble fonctionner. Je suppose que cela n'a pas vraiment de sens de faire OnAppearingcomme étant asyncdu tout, car il ne renvoie pas un Task, et cela se transforme donc en une situation de feu et d'oubli en ce qui concerne le cadre d'appel. Il en va de même par extension DisplayAlertdans ce contexte. Donc , d'une part , je ne pense pas vraiment que cela fonctionne du tout, mais si je me trompe, est - il possible d'utiliser DisplayAlertdans OnAppearing?

Mettre à jour

Il semble que je n'ai pas réussi à fournir un certain contexte. Je travaille à partir d'un modèle Shell Xamarin.Forms ; bien que j'en ai déjà développé quelques-uns après le modèle initial, il est donc difficile de dire à ce stade dans quelle mesure le Shell lui-même y contribue. De plus, ma plate-forme cible principale est Android.

Cela étant dit, j'ai pu démarrer un modèle d'application vierge et essayer le code ci-dessus dans le code autrement frais MainPage- les deux ont bien fonctionné. Je ne sais toujours pas pourquoi ils ne fonctionnent pas dans mon contexte d'application réel, je vais donc creuser là-bas et rendre compte de toutes les conclusions.

Bondoline

J'ai poussé ma petite expérience un peu plus loin et j'ai essayé l'application de modèle Shell de base.

L'ajout de l'exemple de DisplayAlertcode OP au code principal principal ItemsPagen'a pas fonctionné. Si j'ai fait ça,

protected async override void OnAppearing()
{
    base.OnAppearing();

    if (viewModel.Items.Count == 0)
        viewModel.LoadItemsCommand.Execute(null);

    await this.DisplayAlert("Alert", "Consider yourself alerted", "OK");
}

les éléments se chargeraient mais aucune boîte de dialogue ne s'afficherait. Si à la place j'ai déplacé la boîte de dialogue vers le haut,

protected async override void OnAppearing()
{
    base.OnAppearing();

    await this.DisplayAlert("Alert", "Consider yourself alerted", "OK");

    if (viewModel.Items.Count == 0)
        viewModel.LoadItemsCommand.Execute(null);
}

la boîte de dialogue ne s'afficherait pas et les éléments ne se chargeraient pas. Ainsi, l'exécution asynchrone est morte et/ou s'est égarée dans le grand seau dans le ciel.

J'ai ensuite essayé d'ajouter l' DisplayAlertéchantillon à la AppShellpage principale , seulement pour constater que le OnAppearingremplacement n'est pas du tout appelé pour la Shellclasse. Cela a été confirmé par le problème Shell ouvert suivant : [Bug] Shell - OnAppearing n'exécute pas #6486 .

Enfin, juste pour finir, j'ai essayé de pirater un appel à DisplayAlertdans le rappel asynchrone exécuté par LoadItemsCommandin ItemsPage.OnAppearing. Un peu méchant car cela passe la vue dans le modèle de vue, ce qui va directement à l'encontre du bon MVVM en premier lieu --

async Task ExecuteLoadItemsCommand(ItemsPage view)
{
    if (IsBusy)
        return;

    IsBusy = true;

    try
    {
        Items.Clear();
        var items = await DataStore.GetItemsAsync(true);
        foreach (var item in items)
        {
            Items.Add(item);
        }

        await Device.InvokeOnMainThreadAsync(async () =>
            await view.DisplayAlert("Alert", "Consider yourself alerted", "OK"));
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
    }
    finally
    {
        IsBusy = false;
    }
}

Ne me lapide pas.

Cela ne semblait pas avoir de meilleurs résultats. Tout comme lors de l'appel DisplayAlertdirect dans la page OnAppearing, l'exécution a juste pris une pause déjeuner. Le spinner lié au IsBusydrapeau ne s'est jamais arrêté, ce qui indique que le finallybloc n'a même jamais été exécuté.

Ma compréhension générale à ce stade est qu'il existe actuellement une certaine limitation dans le type d'opérations asynchrones qui peuvent être effectuées à partir d'un shell ContentPage. Même l' awaitappel ed à DataStore.GetItemsAsyncn'est pas vraiment asynchrone dans cette implémentation, donc je doute un peu que cela fonctionnerait réellement avec une connexion réelle et asynchrone à la base de données. J'ai pu DisplayAlerttravailler dans le contexte d'un gestionnaire d'événements normal, donc je pense que le problème est limité à la logique d'initialisation qui se déroule pendant OnAppearinget à tout ce qu'il finit par appeler ou planifier directement. Une grande partie de cela ne sont que des spéculations d'observation, mais je peux transmettre cela comme un bogue, à moins que quelqu'un puisse offrir une analyse plus complète.

Mise à jour (pour clôture, TOC, documentation, etc.)

Comme l'indiquent les commentaires, la version de Xamarin.Forms que j'utilisais (4.2.0) avait un bogue qui a été corrigé dans les versions ultérieures.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Xamarin Forms : onAppearing() ne se déclenche pas lors du chargement de la page

Que se passe-t-il dans OnAppearing of Xamarin Forms?

Alternative à base.OnAppearing dans Xamarin.Forms

Comment changer de page dans Xamarin.Forms?

Xamarin Forms - Variable d'accès dans une autre page

Coller la mise en page dans Xamarin Forms en bas

Changer de page après la connexion dans Xamarin Forms

Page de détail principale dans xamarin.forms

Événement Page.Loaded approprié dans Xamarin.Forms

Navigation dans la même page Xamarin.Forms

Pousser une page existante dans Xamarin.Forms

Xamarin Forms overriding OnAppearing causes app to crash

DisplayAlert causing application to crash in Xamarin.Forms

Xamarin - exécute le code «OnAppearing ()» uniquement lorsque la page est chargée

Xamarin Forms "... DisplayAlert n'existe pas dans le contexte actuel."

Comment appuyer sur la page maître dans la page Master Detail dans Xamarin Forms UI Test ?

Comment puis-je modifier la page par programme dans CarouselPage dans Xamarin.forms?

Comment ajouter un contrôle utilisateur dans une page à onglets dans xamarin.forms

Comment partager des valeurs entre des pages dans une page à onglets dans Xamarin.Forms?

formulaires xamarin - utilisation de RaiseChild dans OnAppearing

Xamarin Forms - WebViewSource affiche une page vierge

Xamarin.Forms suppression d'une page

How to redirect to next view page in Xamarin Forms?

Xamarin Forms Add shadow on MasterDetailPage content page

Animation de transition de page Xamarin Forms

How to close opened page in ViewModel in xamarin forms

DisplayAlert () ne s'affiche pas dans la mise en page personnalisée

La page XAML par défaut et la nouvelle page XAML dans Xamarin Forms ne sont pas identiques

Impossible d'afficher les liaisons sur la page XAML dans Xamarin.forms

TOP liste

  1. 1

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  2. 2

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  3. 3

    Passer la taille d'un tableau 2D à une fonction ?

  4. 4

    Microsoft.WebApplication.targets

  5. 5

    comment afficher un bouton au-dessus d'un autre élément ?

  6. 6

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  7. 7

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  8. 8

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  9. 9

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  10. 10

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  11. 11

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  12. 12

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  13. 13

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  14. 14

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  15. 15

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  16. 16

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  17. 17

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  18. 18

    Créer un système Buzzer à l'aide de python

  19. 19

    Exporter la table de l'arborescence vers CSV avec mise en forme

  20. 20

    loop in time using laravel 8

  21. 21

    Comment activer le message Pylint "too-many-locals" dans VS Code?

chaudétiquette

Archive