Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题
Naxam.BottomTabbedPage的使用:
http://www.cnblogs.com/devin_zhou/p/8278794.html
在将Xamarin.Forms更新到3.0后,BottomTappedPage在被释放的时候会引起崩溃。
崩溃在哪里引起的呢:
通过调试源码发现BottomTabbedRenderer中Dispose被调用了两次,第一次正常Dispose掉过后,Element已经被释放了,第二次Dispose的时候Element便引起了NullPointerException。
现在来看源码中Dispose方法:
protected override void Dispose(bool disposing) { if (disposing) { Element.ChildAdded -= PagesChanged; Element.ChildRemoved -= PagesChanged; Element.ChildrenReordered -= PagesChanged; if (rootLayout != null) { //TODO Cleanup RemoveAllViews(); foreach (Page pageToRemove in Element.Children) { IVisualElementRenderer pageRenderer = Platform.GetRenderer(pageToRemove); if (pageRenderer != null) { pageRenderer.ViewGroup.RemoveFromParent(); pageRenderer.Dispose(); } } if (bottomNav != null) { bottomNav.SetOnNavigationItemSelectedListener(null); bottomNav.Dispose(); bottomNav = null; } rootLayout.Dispose(); rootLayout = null; } } base.Dispose(disposing); }
不修改源码的解决方案:
首先新建MyTabbedPage一个类继承BottomTabbedPage
public class MyTabbedPage : Naxam.Controls.Forms.BottomTabbedPage { public MyTabbedPage () { } }
然后新建MyTabbedPageRenderer继承BottomTabbedRenderer,并重新Dispose方法,在Dispose方法中对Element进行判断
[assembly: ExportRenderer(typeof(MyTabbedPage), typeof(MyTabbedPageRenderer))] namespace Demo.Droid.Renderers { /// <summary> /// 重写BottomTabbedRenderer 解决Xamarin.Forms3.0中,Dispose方法被调用两次,引起崩溃问题 /// </summary> public class MyTabbedPageRenderer: BottomTabbedRenderer { protected override void Dispose(bool disposing) { if (disposing && Element != null) { base.Dispose(disposing); } } } }
原文地址:https://www.cnblogs.com/devin_zhou/p/9028214.html
时间: 2024-10-13 22:53:02