iOSでXamarin.FormsのMaterial Visualを使用している際にUI更新で例外が発生する場合の回避策
お仕事で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が承認されているのでそのうち修正版がリリースされると思いますが、待ちきれない方は上の回避策を試してみてください。
フォローしませんか?
お気軽にご依頼・ご相談ください