© Smart Design/Shutterstock.com
MvvmCross: Cross-Plattform-Xamarin-Apps mit weniger Code Behind

MvvmCross als Basis für Xamarin-Apps


Xamarin liefert die Basis, um Apps für die großen mobilen Plattformen in C# schreiben zu können. MvvmCross liefert die Werkzeuge, um möglichst viel Code plattformunabhängig zu schreiben.

Seit Xamarin auf dem Markt ist, hat sich die C#-Welt erheblich vergrößert. Mit Zugriff auf Android, Mac und iOS können C#-Entwickler heutzutage alle wichtigen Plattformen mit einer Programmiersprache ansprechen. Doch während Xamarin sich um die Vereinheitlichung der Programmiersprache kümmert, müssen sich die Entwickler trotzdem mit verschiedenen Entwurfsmustern der jeweiligen Plattformen auseinandersetzen.

Geteiltes Leid ist halbes Leid

Das Ziel aller Cross-Plattform-Ansätze ist das Teilen von möglichst viel Programmcode auf allen Zielplattformen. Der Vorteil von geteiltem Code liegt auf der Hand: Jede Zeile Code, den man auf allen Plattformen ausführen kann, spart Entwicklungszeit.

Grundsätzlich lässt sich Code dann gut teilen, wenn keine plattformspezifischen Funktionen aufgerufen werden. Das trifft vor allem auf die Datenschicht und die Businesslogik zu. Auf der anderen Seite stehen das UI und plattformspezifische Features wie beispielsweise Apples Siri oder Microsofts Cortana. Code für diese Ebene ist nur sehr eingeschränkt teilbar.

Unterschiedliche Entwurfsmuster

Eine weitere Herausforderung beim Teilen von Programmcode ist das unter iOS und Android übliche Entwurfsmusters Model View Controller, kurz MVC. Bei MVC wird die App in die drei namensgebenden Schichten aufgeteilt:

  • Die View zeigt Daten aus dem Model an und gibt Interaktionen an den Controller weiter.

  • Der Controller steuert die View, verarbeitet Nutzerinteraktionen und ändert Daten im Model.

  • Das Model beinhaltet die Daten und die Businesslogik.

Da der Controllercode das UI direkt manipuliert, muss er mit den plattformspezifischen UI-Elementen arbeiten. So lässt sich der Controllercode nur schlecht teilen.

Unter Windows hat sich das Entwurfsmuster Model View ViewModel, kurz MVVM, etabliert. MVVM ist mit MVC verwandt und definiert ebenfalls drei Schichten (Abb. 1):

  • Die View bindet sich via Data Binding an das ViewModel und reagiert auf Aktualisierungen im ViewModel.

  • Das ViewModel beeinflusst die Daten im Model, macht Daten öffentlich sichtbar und benachrichtigt über Änderungen an den öffentlichen Daten.

  • Das Model beinhaltet die Daten und die Business­logik.

Der für die Cross-Plattform-Entwicklung wichtige Punkt ist das Data Binding, bei dem sich die View mit dem ViewModel verbindet, ohne dass das ViewModel die View kennen muss. Die Benachrichtigung bei Änderungen des ViewModels erfolgt über Events. Die Data Bindings reagieren auf diese Events und aktualisieren die View, wenn sich die Daten ändern.

piontek_1.tif_fmt1.jpgAbb. 1: Vergleich MVVM und MVC

MvvmCross

MvvmCross ist ein für Xamarin entwickeltes Framework mit dem Ziel, durch die einheitliche Verwendung von MVVM möglichst viel Programmcode zwischen den Plattformen zu teilen. MvvmCross wird quelloffen über ein GitHub Repository von einer aktiven Community stetig weiterentwickelt. Auch wenn das Framework mittlerweile sehr umfassend ist, besteht es im Kern aus einer Handvoll Funktionen, die die Verwendung von MVVM auf Xamarin-Plattformen ermöglichen. Die wichtigsten Funktionen sind dabei

  • ein eigener, plattformunabhängiger App-Kern, der die Kontrolle der App auf die ViewModel-Ebene verschiebt,

  • Data Bindings für das UI der Nicht-Windows-Plattformen,

  • eine einheitliche Navigationsstruktur auf ViewModel-Ebene.

Die Homepage ist hier zu finden [1].

Die Demo-App

Am besten lässt sich der Umgang mit dem Framework in der Praxis veranschaulichen. Ziel der Demo-App ist es, den aktuellen RSS Feed von www.entwickler.de abzurufen und die erhaltenen News anzuzeigen. In der Auflistung der News soll ein Klick auf eine News eine Detailseite mit mehr Informationen öffnen. Der vollständige Quellcode der Demo befindet sich hier [2].

Allgemeiner Aufbau

Die Demo besteht aus drei Projekten – zwei Plattformprojekten für Xamarin Android und Xamarin iOS sowie eine Portable Class Library (PCL) (Abb. 2). Im Quellcode der Demo ist zur Veranschaulichung noch ein weiteres Plattformprojekt für Windows enthalten.

piontek_2.tif_fmt1.jpgAbb. 2: Die drei Projekte der Demo

Die PCL

Die PCL ist der Kern der Demo. Sie enthält die plattformunabhängige Model- und ViewModel-Schicht. Nur die View-Schicht ist in den jeweiligen Plattformprojekten untergebracht und kann entsprechend nicht geteilt werden. Die PCL ist eine spezielle Klassenbibliothek für Cross-Plattform-Projekte, die den gemeinsamen Nenner aus dem .NET Framework aller Zielplattformen umfasst. In der Praxis kann man hier problemlos Daten und Objekte halten und verarbeiten, aber man hat keinen Zugriff auf Plattformfunktionen oder das jeweilige UI. Doch nur durch diese Einschränkungen ist die PCL plattformunabhängig. In der PCL wird der RSS Feed abgerufen, verarbeitet und die Daten über zwei ViewModels für die beiden Views bereitgestellt.

Um MvvmCross nutzen zu können, muss das Framework referenziert werden. Über den NuGet Package Manager wurde für die Demo das Paket MvvmCross.StarterPack (Version 4.4.0) heruntergeladen. Dieses Paket enthält alle benötigten MvvmCross-Pakete für die PCL.

MvvmCross benötigt einen Startpunkt in der PCL, über den das Framework und das erste ViewModel gestartet werden können. Dieser Startpunkt ist eine Implementierung der MvxApplication. Jede Plattform wird diese Klasse und damit das Framework starten.

public class App : MvxApplication { public override void Initialize() { RegisterAppStart<ViewModels.NewsListViewModel>(); } }

Das NewsListViewModel

Das NewsListViewModel beinhaltet zwei MvxCommands sowie eine Liste der abgerufenen News. Über die Commands werden die News aktual...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang