码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-05-12 14:25:49      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:poi   page   red   todo   demo   方案   继承   3.0   alt   

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

 

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

标签:poi   page   red   todo   demo   方案   继承   3.0   alt   

原文地址:https://www.cnblogs.com/devin_zhou/p/9028214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!