Xamarin.forms中nuGet包冲突的自定义呈现

Xamarin.forms中nuGet包冲突的自定义呈现,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在使用Xamarin.forms制作应用程序。(PCL) 我刚刚注意到使用自定义渲染器的严重问题。 我来自这条线。 这个线程说,我体验到只有一个渲染器类同时工作。 这意味着,如果两个不同的包使用相同的渲染器,其中一个将无法工作。(它遵循类层次结构。因此子类类将工作,而其他类将停止工作) 刚添加的包可能会破坏原始包或我的包,而真正的问题是开发人员当时可能并没有注意到 为什么它是这样工作的? 或者,我是不是错了 范例 如果您已经为ContentPage制作了自定义呈现程序,并安装了具有Co

我正在使用Xamarin.forms制作应用程序。(PCL)

我刚刚注意到使用自定义渲染器的严重问题。 我来自这条线。

这个线程说,我体验到只有一个渲染器类同时工作。 这意味着,如果两个不同的包使用相同的渲染器,其中一个将无法工作。(它遵循类层次结构。因此子类类将工作,而其他类将停止工作)

刚添加的包可能会破坏原始包或我的包,而真正的问题是开发人员当时可能并没有注意到

为什么它是这样工作的? 或者,我是不是错了

  • 范例
如果您已经为ContentPage制作了自定义呈现程序,并安装了具有ContentPage或Page自定义呈现程序的软件包。在我的例子中,KeyboardOverlap.Forms.Plugin可以。并且两个呈现器类都重写了onPearing()。当你运行你的应用程序时。将只触发一个渲染器的OnPearing


我当然可以手动合并。但是,如果它们都是nuGet包,并且不能修改它们呢。(当然我可以使用Github,但这会导致另一个问题)

每个自定义渲染器都应该有一个唯一的名称。获得冲突的唯一方法是渲染器重写基类。。。永远不要这样做,而是应该继承默认值,并确保在重写时调用
base

如果nuget包因为覆盖默认值而损坏,则必须告诉他们修复它

在您所指的代码中,作者正在覆盖
页面
,而不是制作自己的
键盘重叠页面

应该是这样

[assembly: ExportRenderer (typeof(KeyboardOverlapPage), typeof(KeyboardOverlapRenderer))]
然后在PCL上一节课

public class KeyboardOverlapPage : Xamarin.Forms.Page {}
换句话说,作者有一个实现糟糕的包,应该修复它。一旦修复,您就可以在任何需要该功能的地方使用页面来代替页面


如果特定平台上没有自定义渲染器,它将自动返回默认行为。

您能举个例子吗?我不确定我是否完全明白。我用表单编写了一些相当复杂的应用程序,从来没有遇到过渲染器不工作的问题。@ChaseFlorell,如果您已经为ContentPage制作了自定义渲染器,并安装了具有自定义ContentPage或Page渲染器的包。在我的例子中,KeyboardOverlap.Forms.Plugin可以。并且两个呈现器类都重写了onPearing()。当你运行你的应用程序时。将只触发一个渲染器的OnPearing。不是每个自定义渲染器都有唯一的名称吗?唯一失败的方法是重写默认值。。。永远不要这样做,而是从默认值继承,并确保在重写时调用
base
。如果nuget pkg因为覆盖默认设置而被破坏,请告诉他们修复它。@ChaseFlorell谢谢Chase,我对你的回答发表了评论。你能回答这个问题吗?我想知道你所指的具体回购协议。嗨,蔡斯。谢谢你慷慨的回答。但我已经知道避免重写默认类是一种方法。但这仍然意味着一次只能使用一个渲染器,对吗?只有使用这两种功能的渲染器才是手动合并?我真的很想知道。如果是这样,这不是有点烦人吗?再次感谢您添加了一个问题。我问这个问题的原因是,即使KeyboardOverlap creator像您所说的那样更改了他们的包,它仍然可能会破坏我自己为XXXContentPage定制的渲染器。我必须选择其中一个,除非我必须手动合并。但在添加nuGet时没有机会合并它们。我应该为他的自定义渲染器类创建子类。这就是我发现的。