Xamarin.Forms Material Visualのバグ修正しました
お仕事で踏んだXamarin.Formsのバグ修正をしました。
この記事を書いている時点でPR承認済みなのでそのうち取り込まれてリリースされると思います。
[Bug] iOS Material Renderers can cause NRE. · Issue #15669 · xamarin/Xamarin.Forms
この問題はMaterial Visual(いわゆるマテリアルデザイン化するやつ)を使っていると、iOSでまれにNullReferenceExceptionが発生するというものです。
原因個所はレイアウト更新時のnullチェックで、タイミングが悪いとMaterialXxxxRendererがElement(Xamarin.Formsコントロール)付け替え中にそのプロパティを参照してNREになるようです。
今この問題を踏んで困っている人向けの回避策
MaterialXxxxRendererのカスタムRendererでApplyThemeIfNeededにnullチェックを追加して差し替えましょう。 (サンプルは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();
}
}
}