xamarin формы: исключение System.ArgumentNullException (IOS) - PullRequest
0 голосов
/ 27 марта 2020

Я использую 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 Renderer

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 при запуске проекта.

Скриншоты:

enter image description here

Ответы [ 3 ]

1 голос
/ 27 марта 2020

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);
            ...
1 голос
/ 27 марта 2020

Метод LoadHtmlString, который, я считаю, является причиной исключения. Теперь он говорит, что это ArgumentNullException, т. Е. Аргумент, который не должен быть нулевым, является нулевым, и чтобы исправить то, что вы не должны передавать нулевое значение для WkWebView, вы можете просто передать MainBundle NSBundle. BaseUrl, как показано ниже:

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

Если проблема не устранена, пожалуйста, убедитесь, что вы добавили StackTrace в вопрос.

Goodluck, не стесняйтесь возвращаться, если у вас есть вопросы.

ОБНОВЛЕНИЕ

Кроме того, вы можете использовать WkWebViewRenderer, если у вас XF 4.4 и выше!

0 голосов
/ 30 марта 2020

Получил ответ от моей XF темы , разместив его здесь. Здесь также загружен пример проекта.

Я обнаружил, что вы использовали библиотеку. Net Framework в проекте Forms, удалите ее и используйте. Net Стандартный HttpClient. Во-вторых, попробуйте отключить ATS для определенного URL-адреса, например:

<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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...