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);
        }
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遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

新版测试中

初一下期中试卷

c++理解协程05

Access中VBA中excel文件中的VLookup

Groovy闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

在 Django 中,根据模型中其他字段中选择的值删除选择字段下拉列表中的选项