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

标签 c# android mvvm webview xamarin.forms

问题

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

有趣的是它第一次“工作”:在我注销并再次登录后,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/

相关文章:

android - 如何使用 Intent 以 .mp4 格式录制视频

java - 因为我可以生成自动通知

android - 如何获取最新的 Room 版本?

c# - 如何使用 DataTemplate + 触发器在 View 之间切换

WPF ListView SelectedValue 未设置

c# - 转换器没有被调用

c# - Windows Phone 8.1 通用应用程序中 SaveRingtoneTask 的替代方案是什么

c# - 更改系统托盘颜色 Windows Phone

c# - 从解决方案中的所有文件中删除注释

c# - Bundler 不包括 .min 文件