Comet - MVU w MAUI bez XAML, czyli próba dogonienia Fluttera
MAUI jest już z nami od kilku miesięcy i jest bardzo mocno promowane przez Microsoft. Jest to niezmiernie ciekawa opcja do pisania aplikacji pod różne systemy i środowiska. O ile jednak w przypadku pisania aplikacji desktopowych czy webowych, taki MAUI jest ciekawostką dla deweloperów .NET, to w przypadku świata mobilnego jest zupełnie inaczej.
Rok temu w listopadzie 2021 pisałem o tym jak tworzenie mobilnych aplikacji w .NET jest nie lada wyzwaniem. Oficjalne zakończenie wsparcia dla Xamarin.Forms i przedstawienie alternatywy w postaci MAUI, które w 2021 roku nie doczekało się premiery, powodowało ból głowy mobilnych deweloperów .NET. Mimo, iż w maju 2022 roku MAUI miało oficjalną premierę, to nadal sytuacja nie jest wcale lepsza.
Samo MAUI nie jest jeszcze narzędziem, które można uznać w 100% gotowe na to, aby pójść z nim na produkcję. Wiele jeszcze mniejszych niedoróbek i problemów spędza sen z powiek deweloperów mobilnych w .NET. Mimo, że dostaliśmy wersję finalną, nie jest to wersja, która pozwoli na bezproblemowe działanie aplikacji biznesowych. Szczególnie jest to niekomfortowe, gdy chcąc pisać mobilne aplikacje w .NET, nie mamy alternatywy. Ale problemem jest również to, że MAUI nadal siedzi głęboko w roku 2008...
XAML - archaizm będący hamulcem MAUI
miało mogę powiedzieć, że dla MAUI ciężko coś zarzucić (abstrahując już od problemów wieku dziecięcego). Świetne podstawy w założeniach, duże zaangażowanie Microsoftu i spory udział społeczności. Jest tylko jedno "ale" i to dość duże - XAML.
XAML miał premierę dawno temu w okolicach powstania WPF / WF. Przez ten czas był ściśle związany z tworzeniem UI i stał się w pewnych kręgach wymarzonym "produktem" do tworzenia interfejsu. WPF (niech żyje na wieki) czy nowy WinUI 3 (rozkręca się) opierają się na XAML i nikt go tam nie piętnuje. Ale XAML to też technologie, zapomniane i słusznie wymarłe jak Silverlight, Windows Phone czy UWA, a teraz i Xamarin. Przez te lata świat się zmieniał, a XAML jak był ociężały i przegadany tak i nadal jest.
Będąc ostatnio na .NET Developer Days jedna z głównych prezentacji związana była właśnie z MAUI. A że można było tam zadawać pytania przez mobilną apkę, zerknąłem o co uczestnicy konferencji najczęściej pytają. I nie uwierzycie. Tak. "Dlaczego w MAUI nadal jest XAML?". Cóż, zatem nie tylko ja mam dość ambiwalentne podejście do MAUI właśnie przez ponownie użycie XAML, które wg mnie, w większych aplikacjach zupełnie nie sprawdzało się w Xamarinie (Forms). Widoki mobilne w XAML są nad wyraz opasłe i w połączeniu z MVVM tworzą dziwną hybrydę lekkości z przesadnie sformalizowaną składnią opartą na XML.
Szczególnie widać "klocowatość" języka XAML, gdy wychylimy się trochę poza nasz .NETowy grajdołek. A tu, od kilku lat, w mobilce rozpycha się z niemałym sukcesem...
Flutter
Mobilny framework od Google pozwala na pisanie szybkich i łatwych w utrzymaniu aplikacji. Wykorzystując wzorzec MVU tworzone aplikacje nie są rozdmuchane w kodzie i w widokach, niczym w klasycznym podejściu Xamarinowym (Forms) z wielkimi XAMLami. Tutaj w kodzie Dartowym (języku odratowanym z zapomnienia) tworzymy widoki, co jest o wiele prostsze i łatwiejsze w tworzeniu, a także utrzymaniu.
Na szczęście jest światełko w tunelu.
Comet - MVU dla MAUI
Po wspomnianej już wcześniej prezentacji o MAUI podszedłem do prelegenta (James Montemagno) z pytaniem dlaczego znowu XAML i czy będzie coś w zamian. I tu usłyszałem, że XAML było po prostu najłatwiej i najszybciej wrzucić do MAUI. Nie da się ukryć tego, ale dodał też że Microsoft patrzy z ciekawością na projekt Comet, a który już wcześniej poznałem.
Jest to oddolna inicjatywa stworzona przez społeczność, która chce aby MAUI był faktycznie nowoczesną platformą do tworzenia wieloplatformowych aplikacji. Pakiet dodaje do MAUI możliwość tworzenia aplikacji w oparciu o MVU (Model - View - Update), wyrzucając potrzebę grzebania się w XAML.
Tworzenie aplikacji w ten sposób jest niezmiernie proste i przejrzyste (i bardzo zbliżone do tego co oferuje Flutter). Klasyczny "Hello World" z licznikiem kliknięć na przycisk może wyglądać tak:
public class MyPage : View { readonly State<int> clickCount = 1; readonly State<string> text = "Hello World"; public MyPage() { Body = () => new VStack { new Text (text), new Button("Update Text", () => state.Text = $"Click Count: {clickCount.Value++}") }; } }
W tym przypadku naszym View jest ekran zaś Model to obiekty State, a Update robiony jest przez Comet. To samo możemy zrobić jeszcze inaczej, poprzez atrybuty:
public class MyPage : View { [State] readonly HelloWorldModel hello = new { Text = "Hello World" }; [Body] View body() => new VStack { new Text (() => hello.Text), new Button("Update Text", () => hello.Text = $"Click Count: {hello.Value++}") }; public class HelloWorldModel: BindingObject { public int Value { get => GetProperty<int>(); set => SetProperty(value); } public string Text { get => GetProperty<string>(); set => SetProperty(value); } } }
Repozytorium jest dostępne oczywiście na GitHube: https://github.com/dotnet/Comet.
Początki projektu sięgają roku 2019 i obecnie repozytorium znajduje się w domenie Microsoftowej "dotnet". Głównym deweloperem jest James Clancey. Do niedawna był on pracownikiem Microsoftu, ale w czerwcu tego roku rzucił giganta z Redomond i rozpoczął prace w Meta od Fecbooka.
Od razu warto wziąć pod uwagę, że mimo zainteresowania Cometem ze strony Microsoftu, jest to nadal projekt, który jest tylko podglądową paczką jako PoC. Mimo tego, posiada on HotReload i pełne wsparcie dla debugowania. Społeczność bardzo szybko zainteresowała się Cometem. W sieci znajdziemy wiele wpisów blogowych i poradników na YouTubie odnośnie tego projektu.
Comet aż się prosi o to, aby Microsoft oficjalnie wziął pod swoje skrzydła ten projekt i rozpoczął wreszcie prace nad MVU w MAUI. XAML jest ciekawy, ale konkurencja w postaci Fluttera odskoczyła bardzo daleko. Tak bardzo, że pudrowanie MAUI poprzez XAML mocno nadwyręża społeczność deweloperów, którzy oczekują po następcy Xamarin.Forms faktycznie bycia platformową nowoczesną, a nie tkwiącą jeszcze w zamierzchłych czasach Silverlighta i Windows Phone. Liczę, że faktycznie Comet (albo jego odpowiednik od Microsoftu) będzie w stanie dostarczyć swobodę MVU od Fluttera w projektach MAUI. Czego życzę sobie i Wam.
(Wpis na blog.djfoxer.pl)