【问题标题】:xamarin forms: System.ArgumentNullException has been thrown (IOS)xamarin 表单:已引发 System.ArgumentNullException (IOS)
【发布时间】:2020-03-31 17:37:21
【问题描述】:

我正在使用 webview 来解析我的 HTML 数据。为此,我使用了自定义渲染。

在主项目中:

public  class MyWebView : WebView
{
    public static readonly BindableProperty UrlProperty = BindableProperty.Create(
    propertyName: "Url",
    returnType: typeof(string),
    declaringType: typeof(MyWebView),
    defaultValue: default(string));

    public string Url
    {
        get { return (string)GetValue(UrlProperty); }
        set { SetValue(UrlProperty, value); }
    }
}

Ios 渲染器

public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
{
    WKWebView _wkWebView;
    protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            var config = new WKWebViewConfiguration();
            _wkWebView = new WKWebView(Frame, config);
            SetNativeControl(_wkWebView);
        }
        if (e.NewElement != null)
        {
            Control.LoadHtmlString(Element.Url, null);   //use this code instead
            //Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
        }
    }
}

在 XAML 和 XAML.cs 中:

<local:MyWebView 
    x:Name="web_view"
    VerticalOptions="FillAndExpand"/>

web_view.Url = htmldata;

但我在运行项目时收到System.ArgumentNullException

截图:

【问题讨论】:

    标签: xamarin.forms webview argumentnullexception


    【解决方案1】:

    我认为 LoadHtmlString 方法是导致异常的原因,现在它说它是一个 ArgumentNullException 即不应为 null 的参数为 null 并且要解决您不应该为 WkWebView 传递 null 的问题,您可以简单地传递 NSBundle 的 MainBundle BaseUrl如下图:

      Control.LoadHtmlString(new NSString(Element?.Url), NSBundle.MainBundle.BundleUrl);
    

    如果问题仍然存在,请确保在问题中添加 StackTrace。

    祝你好运,如果您有任何问题,请随时回复。

    更新

    另外,如果你有 XF 4.4 及更高版本,你可以使用WkWebViewRenderer

    【讨论】:

    • 我已将完整的堆栈跟踪添加到问题中。
    • 你确定堆栈跟踪不完整吗?
    • 是的,请您查看我添加的示例项目。
    【解决方案2】:

    WebViewRenderer 总是显示Hello world(如果没有应用样式,则非常小):

    //'WebViewRenderer' is obsolete: 'WebViewRenderer is obsolete as of 4.4.0. Please use the WkWebViewRenderer instead'
    //WkWebViewRenderer inherits from WKWebView
    public class MyWebViewRenderer : WkWebViewRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
    
            if (e.NewElement != null)
            {
                var myWebView = (MyWebView)e.NewElement;
                if (myWebView != null) 
                {
                    ...
                }
                WKWebView wkWebView = this;
                var htmlString = "<html><body>Hello world</body></html>";
                wkWebView.LoadHtmlString(htmlString, null);
                ...
    

    【讨论】:

      【解决方案3】:

      从我的XF thread 得到答案,将其发布在这里。那里还上传了一个示例项目。

      我发现您在 Forms 项目中使用了一个 .Net Framework 库,请删除它并使用 .Net Standard HttpClient。 其次,尝试为您的特定 URL 禁用 ATS,例如:

      <key>NSAppTransportSecurity</key>
      <dict>
          <key>NSExceptionDomains</key>
          <dict>
              <key>services.catholicbrain.com</key>
              <dict>
                  <key>NSIncludesSubdomains</key>
                  <true/>
                  <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                  <true/>
                  <key>NSTemporaryExceptionMinimumTLSVersion</key>
                  <string>TLSv1.1</string>
              </dict>
          </dict>
      </dict>
      

      最后,将加载 URL 代码移至 OnElementPropertyChanged,就像@Graverobber 所说的那样:

      protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
      {
          base.OnElementPropertyChanged(sender, e);
      
          if (e.PropertyName == "Url")
          {
              Control.LoadHtmlString(Element.Url, null);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-05
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 2018-11-08
        相关资源
        最近更新 更多