我在Xamarin.Forms中有一个应用程序,可在登录屏幕后打开WebView。
每次用户注销并再次登录时,都会创建一个新的Page和ViewModel。
通过Chrome的“远程设备”检查设备,我仍然可以看到较旧的WebView。
对于导航,我使用了几年前Evolve应用程序提供的自定义NavigationService。
弹出WebViews的页面时,同时处理Page及其ViewModel。
这是弹出WebView页面并返回登录页面的代码
公共异步任务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;
}
页面的处理,其中浏览器是我在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的处理:
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。
请让我知道是否需要更多信息。
任何指向正确方向的指针将不胜感激。
答案 0 :(得分:0)
第二页。如果您未使用单例模式创建Web视图,则不会获得上一个Web视图。
所以有两种选择:
一个:
使用单例模式,在此页面旁边,您可以获取旧的Web视图。
两个:
离开页面时,可以将WebView的旧实例设置为null
。
在OnDisappearing
方法中:
protected override void OnDisappearing()
{
base.OnDisappearing();
if (null != webView)
{
webView = null;
}
}
或者在Navigation.PopAsync()
之前。