在Xamarin.forms

时间:2016-07-21 14:49:01

标签: xamarin xamarin.forms

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

我刚注意到使用自定义渲染器的严重问题。 我来自这个帖子。 https://forums.xamarin.com/discussion/54317/new-xamarin-forms-guide-custom-renderers/p2

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

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

为什么它如何运作? 或者,我不正确或错误吗?

  • 例如

如果您已为ContentPage和已安装的包创建了自定义渲染器,该包具有ContentPage或Page的自定义渲染器。在我的例子中,KeyboardOverlap.Forms.Plugin。两个Renderer类都重写了OnApearing()。当您运行您的应用程序时。只会触发一个渲染器的OnApearing。

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

1 个答案:

答案 0 :(得分:3)

每个自定义渲染器都应具有唯一名称。您获得冲突的唯一方法是,如果您的渲染器覆盖基类......从不这样做,而是应该继承默认值并确保在覆盖时调用 pool = Pool() for x in a_ndarray: result = pool.map(func, x) save(result) pool.close() pool.join()

如果nuget包被破坏,因为它们会覆盖默认值,您必须告诉他们修复它。

在您引用的代码中,作者将覆盖 pool = Pool() for x in a_ndarray: result = pool.map(func, x) save(result) pool.close() pool.join() ,而不是制作自己的base

This line is causing you pain!

相反它应该是

Page

然后在PCL中有一个班级

KeyboardOverlapPage

换句话说,作者的包实现很差,应该修复它。修复后,您可以在任何地方使用该功能代替页面。

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