Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题

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);
        }
View Code

 不修改源码的解决方案:

首先新建MyTabbedPage一个类继承BottomTabbedPage

public class MyTabbedPage : Naxam.Controls.Forms.BottomTabbedPage
    {
        public MyTabbedPage ()
        {
        }
    }
View Code

然后新建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);
            }

        }
    }
}
View Code

猜你喜欢

转载自www.cnblogs.com/devin_zhou/p/9028214.html
今日推荐