【发布时间】:2021-12-08 20:45:30
【问题描述】:
我在上面看到了关于 xamarin 的 HybridWebView 的 msdn 文档
我了解与 c# 和 vanillajs 进行通信的方式
HybridWebViewRenderer.cs
using Android.Content;
using CustomRenderer;
using CustomRenderer.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(HybridWebView), typeof(HybridWebViewRenderer))]
namespace CustomRenderer.Droid
{
public class HybridWebViewRenderer : WebViewRenderer
{
const string JavascriptFunction = "function invokeCSharpAction(data){jsBridge.invokeAction(data);}";
Context _context;
public HybridWebViewRenderer(Context context) : base(context)
{
_context = context;
}
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
Control.RemoveJavascriptInterface("jsBridge");
((HybridWebView)Element).Cleanup();
}
if (e.NewElement != null)
{
Control.SetWebViewClient(new JavascriptWebViewClient(this, $"javascript: {JavascriptFunction}"));
Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
Control.LoadUrl($"file:///android_asset/Content/{((HybridWebView)Element).Uri}");
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
((HybridWebView)Element).Cleanup();
}
base.Dispose(disposing);
}
}
}
index.html
<html>
<body>
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<h1>HybridWebView Test</h1>
<br />
Enter name: <input type="text" id="name">
<br />
<br />
<button type="button" onclick="javascript: invokeCSCode($('#name').val());">Invoke C# Code</button>
<br />
<p id="result">Result:</p>
<script type="text/javascript">function log(str) {
$('#result').text($('#result').text() + " " + str);
}
function invokeCSCode(data) {
try {
log("Sending Data:" + data);
invokeCSharpAction(data);
}
catch (err) {
log(err);
}
}</script>
</body>
</html>
但我想不出从 jsx 调用 c# 代码的方法,因为据我了解,为了让 JavaScript 执行 C# 代码,它必须执行一个与传递的字符串状态中的 JavaScript 函数同名的函数JavaScript webview 客户端类在 html 中初始化。
通常,如果你在 React 中使用上述方法,你会得到一个错误信息。
我对react了解不多
如果有人曾经通过 Xamarin webview 处理过响应页面,请给我一些提示或建议。
我尝试通过react,或者当我将js文件分离并导入html并运行时得到的错误消息
<html>
<body>
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<h1>HybridWebView Test</h1>
<br />
Enter name: <input type="text" id="name">
<br />
<br />
<button type="button" onclick="javascript: invokeCSCode('1234');">Invoke C# Code</button>
<br />
<p id="result">Result:</p>
<script type="text/javascript" src="test.js"/>
</body>
</html>
index.html
function invokeCSCode(data) {
invokeCSharpAction(data);
}
test.js
【问题讨论】:
-
代码图片没用,不能复制粘贴,不能调试,不能用它们写minimal reproducible example,搜索引擎不能索引。
-
对不起,我替换它
-
您发布的代码与xamarin sample的源代码完全相同。另外,
if you use the above method in React, you will get an error message.你是如何在 React 中使用它的? -
我刚刚将yarn build的结果上传到服务器并进行了测试,但是我得到了未定义的功能。
-
在 xamarin 示例中创建单独的 js 文件后,使用 script 标签运行导入的 xamarin webview 示例时也会发生同样的情况。
标签: c# xamarin xamarin.forms webview