Dans l'application native Xamarin.Forms Gawa, effectuez la requête-réponse de C # vers JavaScript Task <T>

C'est un mémo, donc c'est divers.

scénario

--Xamarin.Forms + WebView (HTML, JavaScript SPA) Application native Gawa --Je souhaite activer / désactiver la touche RETOUR des applications Android en fonction de l'état de la page dans WebView.

couler

    1. [Côté formulaires] ʻAction <TaskCompletionSource <bool >> OnRequestIsEnableBackKey {get; set;}
  1. [Côté formulaires] Développez également `` Task IsEnableBackKeyAsync () '' dans WebViewEx (version étendue de WebView). La mise en œuvre est la suivante.

public Task<bool> IsEnableBackKeyAsync()
{
    var comp = new TaskCompletionSource<bool>();

    if (OnRequestIsEnableBackKey != null)
    {
        OnRequestIsEnableBackKey.Invoke(comp);
    }
    else
    {
        comp.SetResult(false);
    }

    return comp.Task;
}
    1. [Côté Android] Créez MyWebViewRenderer qui est une extension de WebViewRenderer.

Quatre. Créez un JavaScriptHandler en vous référant à Lier JavaScript avec WebView de Xamarin.Forms (avec iOS / Android commun) --Qiita. En plus de Control dans le constructeur, passez `ʻe.NewElement as WebViewEx. Le nom de l'argument est WebViewEx externe ''. Le deuxième argument de AddJavascriptInterface doit être `` GawaApp ''.

Cinq. Écrivez le code pour recevoir OnRequestIsEnableBackKey dans le constructeur de JavaScriptHandler.

private TaskCompletionSource<bool> isEnableBackKeyComp = null;

public JavaScriptHandler(Android.Webkit.WebView webView, WebViewEx outer)
{
    outer.OnRequestIsEnableBackKey = comp => 
    {
        isEnableBackKeyComp = comp;

        //Erreur s'il n'est pas appelé depuis le thread principal
        webView.Post(() =>
        {
            webView.EvaluateJavascript("window.requestIsEnableBackKey()", null);
            // webView.LoadUrl("javascript:window.requestIsEnableBackKey();");← C'est toujours OK
        });
    };
}

Dans le processus jusqu'à présent, lorsque ʻawait webViewEx.IsEnableBackKeyAsync () est appelé du côté Formulaires, la fonction JavaScript`` window.requestIsEnableBackKey () est appelée.

  1. Générez onResultCanExitApp dans JavaScriptHandler. Cette méthode est notifiée du résultat du côté JavaScript. comme suit.
[Export]
[Android.Webkit.JavascriptInterface]
public void onResultIsEnableBackKey(bool value)
{
    isEnableBackKeyComp?.SetResult(value);
    isEnableBackKeyComp = null; // one shot
}

L'appel de `` GawaApp.onResultIsEnableBackKey (true ou false) '' du côté JavaScript rappelle cette méthode. Si vous définissez une valeur sur isEnableBackKeyComp, qui est une TaskCompletionSource, le résultat de «attend webViewEx.IsEnableBackKeyAsync ()» du côté Formulaires est renvoyé.

    1. Le côté JavaScript est sûrement comme ça
window.requestIsEnableBackKey = () => {
  
  //Traiter quelque chose

  GawaApp.onResultIsEnableBackKey(true or false);
}

Je l'ai implémenté à mi-chemin, mais je l'ai abandonné car c'était gênant (je pensais que l'unidirectionnel est plus simple de JavaScript à C #), donc je ne laisserai que l'idée.

Recommended Posts

Dans l'application native Xamarin.Forms Gawa, effectuez la requête-réponse de C # vers JavaScript Task <T>
J'ai essayé de déplacer Hello World (+ α) écrit en langage C à partir de JavaScript [Web Assembly]
J'ai essayé de faire une demande en 3 mois d'inexpérimenté