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(); } } }