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

不修改源码的解决方案:

首先新建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-08-08 14:36:13

Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题的相关文章

Cocos2d-x 3.0 中使用单点触摸

Cocos2d-x 3.0 中使用单点触摸 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2712 在游戏中,经常会用到触摸,大部分游戏也是通过触摸控制游戏角色运动的,在Cocos2d-x 3.0中使用了新的触摸机制,Cocos2d-x 3.0中摒弃了Cocos2d-x 2.0中将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应,在Cocos2d-x 3.0中只需通过创建一个

超高性能Web服务器 hetao 更新至 v0.7.0

超高性能Web服务器 hetao 更新至 v0.7.0了(比Nginx快3倍).更新内容如下: 0.7.0        2016-09-10    calvin* 支持启动后切换到其它用户身份* 修正了fasterhttp的一个致命问题* 修改了makefile以及相关文件以支持直接编译安装到系统目录* 新增配置文件检查工具hetaocheck————————更新历史————————0.6.0        2016-09-07    calvin* 在流类型配置mimetype中增加是否压缩

RancherOS v0.8.0全面发布:支持离线安装,更佳部署体验

RancherOS v0.8.0现已全面发布,采用Linux 4.9.9主线内核,并且支持离线安装,给你更好的部署体验.同时,还有更早启动cloud-init.支持cloud-config验证.新的ZFS服务等一系列新功能. 这个版本的完成相较以前的版本耗时更长,因为我们此前致力于打下更扎实的基础,以便我们后面更快地更新.更频繁地发布新内容和新功能. 新版本亮点 使用Linux 4.9.9主线内核  新版RancherOS采用主线稳定的Linux内核,从而让容器用户得以更快地访问新功能,这也意味

[Xamarin.Android] 在Xamarin.Android项目中使用Component套件

[Xamarin.Android] 在Xamarin.Android项目中使用Component套件 前言 在Xamarin中,可以将自己开发的项目包装成为Component套件,来提供开发人员使用.本篇介绍如何下载并安装Component套件,让开发人员能够使用Xamarin Component Store中的各种Component套件,为自己留个纪录也希望能帮助到有需要的开发人员. 使用 在Xamarin.Android项目中的Components文件夹上,点击右键并且选择「Get More

binder-swagger-java v0.6.0 发布,Swagger API 框架

binder-swagger-java v0.6.0 发布了. 主要更新: 升级到 `form-binder-java` v0.13.0 更新了文档 加了一张图来说明 `binder-swagger-java` 的工作原理: 我们在类的静态块中定义 API 元数据信息,在类扫描/加载时,这些数据被收集到一个全局的 swagger 对象中,这样,当收到获取 swagger.json 的请求时,程序就可以用这个 swagger 对象直接响应了. 文集 http://www.biyinjishi.co

【译】.NET Core 3.0 中的新变化

.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web.桌面.机器学习.容器.IoT 等的版本 3.0. .NET Core 1 .NET Core 的历史可追溯到几年前,版本 1 是在 2016 年推出,旨在生成第一版开放源代码和跨平台(Windows.macOS 和 Linux)的 .NET.灵感来源于只能使用开放源代码框架的客户,以及需要在 Li

Vlang官网文档(中文翻译)-vlang中文文档--v0.1.0_20180625

PS:主要为自己学习,,,,看的时候顺便翻译的,,,渣翻(非全人工)勿喷. 介绍 V是一种用于构建可维护软件的静态类型编译编程语言. 它与Go相似,也受到Oberon.Rust.Swift的影响. V是一种非常简单的语言,阅读这份文档大概只需要半小时的时间,读完之后,您将学习到V的全部内容. 尽管很简单,但是它为开发人员提供了很多功能,你能用其它编程语言做的任何事情,都可以用V做到. Hello World fn main() { println('hello world') } 函数用 fn

Apache Storm 1.1.0 中文文档 | ApacheCN

前言  Apache Storm 是一个免费的,开源的,分布式的实时计算系统. 官方文档: http://storm.apache.org 中文文档: http://storm.apachecn.org ApacheCN 最近组织了翻译 Storm 1.1.0 中文文档 的活动,整体 翻译进度 为 96%. 感谢大家参与到该活动中来 感谢无私奉献的 贡献者,才有了这份 Storm 1.1.0 中文文档 感谢一路有你的陪伴,我们才可以做的更好,走的更快,走的更远,我们一直在努力 ... 网页地址:

小改动,大作为——C# 4.0中的微小改动

1.可选参数和命名实参 可选参数和命名实参就如同一对好基友,因为它们经常一起使用. 1.1 可选参数 可选参数重在“可选”,即在调用方法时,该参数可以明确指定实参,也可以不指定.如下代码所示,下面代码就包含3个参数,一个必备参数和两个可选参数. 1 static void TestMethod(int x,int y=10,string name="LearningHard") 2 { 3 Console.WriteLine($"x={x} y={y} name={name}