ビルド時に、コンパイラーは次のエラーをスローします。
エラーSystem.NullReferenceException:クラスのApp.Droid.Controls.WebViewJavaScriptInterfaceのJavaTypeInfoの作成に失敗しました:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor(Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor(String name、String signature、String connector、String outerType、String superCall)でMethodDefinitionメソッド、ExportAttribute export)(Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.AddMethod(MethodDefinition registeredMethod、MethodDefinition implementationMethod)、Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.ctor(TypeDefinition type、String outerType、Action2 log) .Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator..ctor(TypeDefinition type、Action2 log)at Xamarin.Android.Tasks.Generator.GenerateJavaSource(TaskLoggingHelper log、TypeDefinition t、String outputPath、String applicationJavaClass、Boolean useSharedRuntime、Boolean generateOnCreateOverrides、Boolean has
JavaScriptInterfaceを挿入しようとしているWebビューのカスタムレンダラーを作成しました。上記の問題の原因であるか、そうでない可能性があるさまざまなプロジェクトの解決策があります。
public class WebviewRendererEX : WebViewRenderer
{
Context _context;
public WebviewRendererEX(Context context) : base(context)
{
_context = context;
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
CookieManager cm = CookieManager.Instance;
cm.SetAcceptCookie(true);
cm.SetAcceptThirdPartyCookies(Control, true);
Control.Settings.JavaScriptEnabled = true;
Control.Settings.DomStorageEnabled = true;
Control.AddJavascriptInterface(this, "Android");
Device.BeginInvokeOnMainThread(() =>
{
Control.EvaluateJavascript("function someNavigate(dict){Android.navigateTo(dict);}", null);
});
}
}
}
public class WebViewJavaScriptInterface : Java.Lang.Object
{
private Context context;
public WebViewJavaScriptInterface(Context context)
{
this.context = context;
}
[Java.Interop.Export("navigateTo")]
[JavascriptInterface]
public void NavigateTo(Dictionary<string, object> dict)
{
Console.WriteLine(dict);
}
}
アプリは問題なく動作するはずであり、webviewが読み込まれるとjavascriptInterfaceが機能するはずです。
ビルダーエラーに基づいて、ExportAttribute
を使用して、「JavaメソッドがAndroid Callableラッパー(ACW)」およびDictionary<string, object>
はJavaオブジェクト(duh)ではなく、Javaコードジェネレーターはそれを処理する方法を知りません。
[Java.Interop.Export("navigateTo")]
[JavascriptInterface]
public void NavigateTo(Dictionary<string, object> dict)
{
Console.WriteLine(dict);
}
したがって、この問題に対する簡単な修正は、パラメーターのタイプをDictionary<string, object>
からJava.Lang.Object
に切り替えることでした。これでJavaコードジェネレーターはACWを適切に生成でき、コンパイルは成功します。
[Java.Interop.Export("navigateTo")]
[JavascriptInterface]
public void NavigateTo(Java.Lang.String dict)
{
Console.WriteLine(dict);
}
私もこれに遭遇しました、Xamarinチュートリアルはこれについて人々に警告するべきであるようです。