Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题
Posted Devin.Zhou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题相关的知识,希望对你有一定的参考价值。
Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题
Naxam.BottomTabbedPage V0.2.0.3中已修复
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); } } } }
以上是关于Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章
Groovy闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )