问题
我在 Xamarin.Forms 中有一个应用程序,它在登录屏幕后打开 WebView。
每次用户注销并再次登录时,都会创建一个新的页面和 ViewModel。
通过 Chrome 的远程设备检查设备我仍然可以看到旧的 WebView。
对于导航,我使用了一个自定义 NavigationService,其灵感来自几年前的 Evolve App。
到目前为止我尝试了什么
在弹出 WebView 的页面时处理页面及其 ViewModel。
这是弹出 WebView 页面并返回登录页面的代码
公共(public)异步任务 NavigateBackAsync(bool IgnoraNavegacao) { _isNavigating = true;
try
{
/* Omitted for clarity */
if (currentPage is IDisposable)
((IDisposable)currentPage).Dispose();
if (!(currentPage.GetType() == _homeViewModel))
{
await navigationPage.PopAsync();
}
}
finally
{
_isNavigating = false;
}
页面的 Dispose,其中 Browser 是我在 XAML 中定义的 WebView:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public virtual void Dispose(bool disposing)
{
if (disposing)
{
Browser = null;
var bindingContext = BindingContext as IDisposable;
bindingContext?.Dispose();
BindingContext = null;
}
}
这是 ViewModel 的Dispose:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
OnNavigatingCommand = null;
OnNavigatedCommand = null;
OnBackButtonPressedCommand = null;
}
}
这是我在登录四次后在 Chrome 上看到的:
有趣的是它第一次“工作”:在我注销并再次登录后,Chrome 上只看到一个 WebView。
如果需要更多信息,请告诉我。
任何指向正确方向的指示都将不胜感激。
最佳答案
当第二个到这个页面时。如果你没有使用单例模式创建webview,那么你将不会获得以前的webview。
所以有两种选择:
一个:
使用单例模式,当在这个页面旁边时,可以得到旧的webview。
两个:
离开页面时,您可以将 WebView 的旧实例设置为 null
。
在OnDisappearing
方法中:
protected override void OnDisappearing()
{
base.OnDisappearing();
if (null != webView)
{
webView = null;
}
}
或者在 Navigation.PopAsync()
之前执行。
关于c# - 在 Xamarin.Forms 中处理 WebView 页面的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53731562/