iOSでXamarin.FormsのMaterial Visualを使用している際にUI更新で例外が発生する場合の回避策

ios_xamarinforms_material.jpg お仕事でXamarin.FormsのMaterial Visualを使用していた際に、不意にNullReferenceExceptionが発生するケースに遭遇したので回避策を書いていきます。

この問題はXamarin.FormsでMaterial Visualを使用している際に、iOS限定でまれに発生します。 タイミング問題の一種で「Viewの描画に時間がかかる」、「ListViewのスクロールでコンテンツが再利用される」などの状況が重なると発生しやすくなります。

Material VisualはXamarin.FormsでいわゆるマテリアルデザインなUIを使うための機能です。

回避策

具体的な問題箇所はMaterial系RendererのApplyThemeIfNeeded内のnullチェックにあります。 カスタムクラスを作って元のRendererより先にnullチェックすることで回避できます。 使用しているViewに対応するカスタムRendererを作って差し替えてみてください。(サンプルコードはFrameコントロールの例)

using System;
using Xamarin.Forms;
using Xamarin.Forms.Material.iOS;

[assembly: ExportRenderer(
    typeof(Xamarin.Forms.Frame),
    typeof(XFApp.iOS.MyMaterialFrameRenderer),
    new[] { typeof(VisualMarker.MaterialVisual) })]

namespace XFApp.iOS
{
    public class MyMaterialFrameRenderer : MaterialFrameRenderer
    {
        protected override void ApplyThemeIfNeeded()
        {
            // まれにElement差し替えタイミングで走ることがあるのでnullチェックする。
            if (Element == null) return;
            base.ApplyThemeIfNeeded();
        }
    }
}

修正PRが承認されているのでそのうち修正版がリリースされると思いますが、待ちきれない方は上の回避策を試してみてください。

お気軽にご依頼・ご相談ください

前へ

CSSで乗算やオーバーレイなどの表現が可能に!!mix-blend-modeについて理解を深めてみた

次へ

Power AutomateでAdaptive CardsにメンションをつけてTeamsに投稿してみる