Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Xamarin Forms Embedding

La question qu’on peut se poser face à un développement “mono OS” (iOS, Android ou UWP) c’est de savoir si cela vaut la peine d’utiliser Xamarin.Forms ou la version native (Xamarin.Android, Xamarin.iOS ou directement UWP) ? En réalité la question ne se pose pas car tout peut utilisé à la fois ! Comment ? …

Xamarin.Forms Embedding

C’est lors du Build 2017 que Xamarin a annoncé “Xamarin.Forms Embedding”, c’est à dire la possibilité de prendre n’importe quelle ContentPage et de l’ajouter à une application native de façon quasi transparente.

Xamarin.Forms possède de très nombreux avantages sur les versions natives puisqu’un seul code et une seule UI peuvent générer des Apps pour toutes les plateformes. On aura donc tendance à commencer par là. C’est le meilleur moyen de balayer le plus large possible sans se tromper, d’autant qu’il est possible d’appeler du natif (et même des UI) depuis une App Xamarin.Forms.

Comme vous le savez les Xamarin.Forms vous donne l’impression de dialogue directement avec l’OS sans intermédiaire. Mais cela ne se fait pas tout seul, la poudre n’a pas été réinventée et les XF s’appuie bien entendu sur chaque système natif existant. Ce que montre la petite animation ci-dessous.

2017-06-02_08-12-00-2

Les Xamarin.Forms viennent se poser au dessus des frameworks .NET natifs, qu’il s’agisse de Mono pour Android ou iOS ou même de Windows lui-même pour UWP.

Cette compréhension de l’empilement des couches permet de voir que toute application Xamarin.Forms repose de toute façon sur du Xamarin natif qui est présent et qu’il est possible d’utiliser. C’est le cas d’utilisation indiqué plus haut, à savoir l’appel à une page ou un code purement natif depuis une App Xamarin.Forms.

Mais cela est possible aussi dans l’autre sens, c’est à dire qu’une App n’utilisant que Xamarin natif peut fort bien intégrer ponctuellement une page ou un code Xamarin.Forms.

Comment ?

Il existe pour chaque version native une méthode de ContentPage qui sait retourner non pas l’instance de ContentPage directement mais une enveloppe native intégrant celle-ci.

Par exemple imaginons une page définie comme public partial class MonDialog : ContentPage { … }

La première action à effectuer (une fois et une seule dans l’App donc à son point de lancement en général) est d’initialiser la mécanique des Xamarin.forms par un appel à Forms.Init(). Dans une App iOS on effectuera cet appel dans une surcharge de FinishedLaunching de la classe AppDelegate par exemple.

Le seconde étape consiste à créer la page pour l’utiliser comme n’importe quelle page native de l’OS en cours. En reprenant le même exemple et le même contexte (iOS) l’appel se fera comme suit : navigation.PushViewController(new MonDialog().CreateViewController(),true);

C’est la méthode CreateViewController qui va se charger de prendre l’instance du dialogue et de l’emboiter dans un conteneur natif (iOS ici). Dès lors la page est utilisable comme n’importe quelle page native de l’OS. Et pourtant elle bénéficie de toute la souplesse des Xamarin.Forms !

Sous Android on utilisera CreateFragment(context) qui retourne un Fragment natif là ou CreateViewController pour iOS retourne un UIViewController.

Pour UWP on utilisera CreateFrameworkElement() qui retourne un FrameworkElement.

Les limitations

A l’heure actuelle le NavigationService des Xamarin.Forms n’est pas supporté en dehors des Xamarin.Forms, cela devrait changer dans de prochaines release. En revanche le DependencyService et le MessagingCenter sont totalement opérationnels.

On notera aussi que seule la ContentPage est supportée à ce stade de développement de cette technique mais que cela devrait être étendu sans trop de difficulté à d’autres types dans le futur.

Xamarin.Forms Embedding est disponible pour le moment dans la preview des Xamarin.Forms 3.0. Si vous désirez tester il faudra donc installer cette preview. je vous conseille de le faire sur une machine totalement différente de celle de production bien entendu.

Conclusion

Xamarin.Forms évolue sans cesse, non seulement elles deviennent universelles par leur support des mobiles mais aussi du PC et du Mac, mais en plus elles acceptent tous les décrochages et mélanges avec les systèmes natifs de tous les OS.

Peu importe le projet dans lequel on travaille il y a donc toujours de la place pour Xamarin.Forms et il est toujours temps de basculer des pages en mode Xamarin.Forms sans rien remettre en question et en s’assurant une compatibilité parfaite entre les OS.

L’été crée de belles opportunités pour se former ou s’entraîner, n’hésitez pas à le faire (et à m’appeler si vous avez besoin d’un coup de pouce, après tout c’est mon job plus que d’écrire des articles !).

Stay Tuned !

blog comments powered by Disqus