在Xamarin.Forms中处理WebView页面的正确方法是什么?

时间:2018-12-11 20:03:45

标签: c# android mvvm webview xamarin.forms

问题

我在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 Remote Device

第一次“运行”足够有趣:我注销并再次登录后,在Chrome上只能看到一个WebView。

请让我知道是否需要更多信息。

任何指向正确方向的指针将不胜感激。

1 个答案:

答案 0 :(得分:0)

第二页。如果您未使用单例模式创建Web视图,则不会获得上一个Web视图。

所以有两种选择:

一个:

使用单例模式,在此页面旁边,您可以获取旧的Web视图。

两个:

离开页面时,可以将WebView的旧实例设置为null

OnDisappearing方法中:

 protected override void OnDisappearing()
    {
        base.OnDisappearing();
        if (null != webView)
        {
            webView = null;
        }
    }

或者在Navigation.PopAsync()之前。