【问题标题】:What is the right way to dispose a WebView page in Xamarin.Forms?在 Xamarin.Forms 中处理 WebView 页面的正确方法是什么?
【发布时间】:2019-05-12 21:09:34
【问题描述】:

问题

我在 Xamarin.Forms 中有一个应用程序,它在登录屏幕后打开一个 WebView。

每次用户注销并再次登录时,都会创建一个新的 Page 和 ViewModel。

通过 Chrome 的远程设备检查设备我仍然可以看到旧的 WebView。

对于导航,我使用了一个受几年前 Evolve 应用启发的自定义 NavigationService。

到目前为止我已经尝试过什么

在弹出 WebView 的页面时同时处理页面和它的 ViewModel。

这是弹出WebView的Page并返回Login Page的代码

公共异步任务 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;
}

Page 的 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时如果向服务器发送退出请求操作。
  • @JuniorJiang-MSFT 所有登录和注销都成功。 “第一次工作”是指我第一次登录和再次退出时,Chrome 上只显示一个 Webview。
  • 如果第一个网页视图已经显示,您可以尝试webView.Reload();下次。
  • @JuniorJiang-MSFT 作为导航到 WebView 页面的过程的结果,一个新的 Page 和 ViewModel 被安装,所以我没有重用 WebView 的实例。因此问题是:我如何摆脱旧的?
  • 好的,我提供一个答案,你可以参考一下。

标签: c# android mvvm webview xamarin.forms


【解决方案1】:

当第二个到这个页面。如果你没有使用单例模式创建一个webview,那么你将不会得到以前的webview。

所以有两种选择:

一个:

使用单例模式,在该页面旁边可以看到旧的webview。

两个:

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

OnDisappearing方法中:

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

或者在Navigation.PopAsync()之前做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2021-10-30
    • 2020-12-02
    • 2020-09-23
    • 2012-03-29
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多