-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Description
WARNING: this spec is still a WIP, we're still experimenting with this concept
Description
Slim renderers architecture benefits from multi-targetting and single-project features.
Example
EntryRenderer.cs
public partial class EntryRenderer {
public static PropertyMapper<IView> ViewMapper = new PropertyMapper<IView> {
// Add your own method to map to any property
[nameof(IView.BackgroundColor)] = MapBackgroundColor
};
}EntryRenderer.iOS.cs
// You don’t need to register a new renderer.
public partial class EntryRenderer
{
// You know what method to call because you named it!
public static void MapBackgroundColor (IViewRenderer renderer, IView view)
{
// You don’t need to call any base methods here or worry about order.
// Every renderer is consistent; you know where the native view is.
var nativeView = (NativeView)renderer.NativeView;
var color = view.BackgroundColor;
if (color != null) {
// Phew! That was easy!
nativeView.BackgroundColor = UIColor.FromRGB (204, 153, 255);
}
}
}Standardization of renderers
All the default renderers will be ported to this architecture, for all platforms
Registration of renderers
The rendererRegistrar will exists on the dependency service and be accessed by serviceCollection.Get<IRendererRegistrar>(), allowing control to which renderer is associated to which control
Interfaces on renderers
Mapper concept
The property mapper is responsible for triggering actions in response property changes. A slim renderer itself does not subscribe to the property changes, but some declared actions are executed in response to changes.
The property mapper property of a control is public static and can be extended by user code.
The property mapper plays no role in the feedback loop (button clicked, text entered)
TODO: discuss what to use for mapper key. string or object ? It'd be nice to avoid string comparison in case when we can compare references (in case of BindableProperties)
How to use legacy custom renderers
How to use third-party controls depending on old renderers
How to complement existing renderers
The new extensibility model for this architecture is based on the property mapper. When you want to add support for a new property, it only requires mapping the new property. For the property to exists, subclassing the control is necessary, but subclassing the renderer is not.
Backward Compatibility
Wether we want to keep backward compatibility with existing custom renderers, or subclasses of old renderers will influence the architecture of this