Portovanje Xamarin Forms aplikacije u .NET MAUI

Portovanje Xamarin Forms aplikacije u .NET MAUI

offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12400

Napisano: 30 Jun 2023 21:18

:!: Ovo je opširna tema, tako da će se vremenom dopunjavati i uređivati

Sigurno ste čuli za MAUI, naslednika Xamarin Forms-a.
Ukoliko niste a imate Xamarin Forms projekat, sigurno ste primetili da neki bagovi nisu regulisani duže od godinu dana i da tim nema nameru da iste ispravlja više.

Baš to je jedan od razloga da razmotrite MAUI kao osnovu za vaš naredni projekat.
Jedna od novina jeste što aplikacije razvijene u MAUI-u mogu da rade i na Windows-u i Mac OS-u, Webu pored platformi koje Xamarin Forms podržava.

Osim toga, tu su mnoga druga poboljšanja, poput performansi, bolje organizacije koda (Sav kod je u jednom projektu za razliku od XF-a gde ste imali više platformi) itd.

Kod je skoro identičan, uz izmene koje ćete lako "pokupiti" za pola sata čitajući dokumentaciju.

Bilo kako bilo, to možda i nije razlog da portujete vašu Xamarin Forms aplikaciju u MAUI, pogotovo ako radi kako treba.

Ja sam ovih dana u tim vodama, pa sam hteo da podelim svoja iskustva u nadi da će pomoći bar malo.

Generalno, za portovanje Xamarin Forms aplikacije imate nekoliko opcija :
Za Native projekte :
https://learn.microsoft.com/en-us/dotnet/maui/migration/native-projects

Za XF Projekte
https://learn.microsoft.com/en-us/dotnet/maui/migration/upgrade-assistant

Kako se moje iskustvo veže za XF projekat, ova tema će pokriti samo tu vrstu migracije.

Imamo dve opcije :

1. Da iskoristite automatski alat za migraciju
2. Da "ručno" prebacite vašu aplikaciju u .NET MAUI
3. Da uradite ono što sam ja uradio a o čemu je i ova tema

Ja sam prvobitno pokušao preko alata za migraciju.
U suštini, alat je odradio posao kako treba, međutim završio sam sa "neprirodnim" projektom koji je ličio na Xamarin Forms više nego na ideologiju .NET MAUI-a.
Takođe, bilo je dosta grešaka u samim fajlovima projekta a za koje nisam imao prosto snage da guglam i rešavam pojedinačno.

U svakom slučaju, ovaj alat nije magični štapić koji će portovati vašu aplikaciju i dozvoliti vam da kliknete na Start. Ne, služi samo da izmeni neke očigledne stavke postojećeg projekta i da vam olakša taj deo "pešačenja".

Citat:The .NET Upgrade Assistant is a command-line tool that helps you upgrade Xamarin.Forms projects to .NET Multi-platform App UI (.NET MAUI) by converting the solution's project file and by performing common code updates. Specifically, the tool will:

Convert the Xamarin.Forms class library project, Xamarin.iOS project, and Xamarin.Android project to SDK-style projects.
Update the target framework in project files to net7.0-android and net7.0-ios, as required.
Set <UseMaui>true</UseMaui> in project files.
Add additional project properties, and remove project properties that aren't required.
Add and remove specific NuGet packages:
Remove the Xamarin.Forms and Xamarin.Essentials NuGet packages.
Replace the Xamarin.CommunityToolkit NuGet package with the .NET MAUI Community Toolkit NuGet package.
Replace Xamarin.Forms compatible versions of the SkiaSharp NuGet packages with .NET MAUI compatible versions, if used.
Remove references to the Xamarin.Essentials namespace, and replace the Xamarin.Forms namespace with the Microsoft.Maui and Microsoft.Maui.Controls namespaces.


Uprkos svemu tome što su naveli, ja sam svakako imao tonu referenci ka Xamarin Formsu koje sam morao da izmenim i na kraju sam odustao i odlučio se za "ručni" način.

Ručna migracija je opisana na ovom linku.

Moj projekat koristi skoro sve ugrađene kontrole iz Xamarina, jer sam strogo vodio računa da to bude tako i samim tim sam dobio bazu koda koja je 95% identična MAUI-u.

Zato sam odlučio da napravim prazan .NET 7.0 MAUI projekat, sa istim nazivom i da polako deo po deo prebacujem iz Xamarin Forms aplikacije u MAUI. U suštini od nule ali uz dozu kontrole i ispravljanja uporedo.

Opisaću vam ukratko kako to i vi da uradite :

Pre nego što portujete vaš projekat :

- Proverite da li nuget paketi koje koristite postoje za MAUI
- Xamarin Community Toolkit postoji za MAUI, međutim pretrpeo je izmene i nekih kontrola više nema
- Postoji Xamarin Community Toolkit MAUI Compat, koji omogućava te kontrole da u kompatibilnom režimu rade na MAUIu
- Postoji Xamarin Essentials za MAUI
- Mnogi popularni nuget paketi postoje za MAUI, međutim isto tako dosta paketa nema. Ukoliko neki Nuget ne postoji, razmotrite alternative.
- Mnogi platform specific kodovi su sada integrisani u MAUI, Dependency Service je pretrpeo male izmene u odnosu na XF jer ne postoje posebni projekti za svaku platformu, te ako vaša aplikacija mnogo zavisi od DS-a, proverite pojedinačno za sve vaše stavke na koji način možete da postignete željeni rezultat na MAUI-u (može)
- Pogledajte sve bitne izmene sažete u jednu stranicu

Ukoliko se sve čini izvodljivim, možemo da krenemo.

Korak 1 : Napravite novi .NET MAUI Projekat
- Nazovite projekat istim imenom koje koristi vaš Xamarin Forms projekat
- Izaberite .NET 6 ili .NET 7

Korak 2 : Preuzmite potrebne Nuget pakete za MAUI
- Neki nuget paketi su doživeli promene da se usklade sa MAUI okruženjem. Potrebno je da pročitate dokumentaciju kako da iste inicijalizujete, ukoliko ima potrebe. Oni popularniji poput Newtonsoft JSON-a, mogu samo da se dodaju u aplikaciju i radiće bez problema

Korak 3 : Prekopirajte sve klase koje nemaju veze sa Interfejsom
- Klase poput onih koje komuniciraju sa bazom podataka, obrađuju podatke i slično
- Pošto je podrazumevano da je Namespace isti kao i u vašoj aplikaciji, ovde ne treba očekivati prevelike probleme

Korak 3 : Za svaku stranicu u Xamarin Formsu, napravite .NET MAUI Content Page u MAUI projektu
- Stranice u MAUI-u koriste drugi namespace, na ovaj način izbegavate ispravljanje svake stranice pojedinačno, ali ako ima potrebe i ako je vaš namespace kompleksniji, prilagodite isti da bude isti kao u Xamarin Forms aplikaciji. Cilj je samo da prekopiramo kod i ispravimo ono što mora, a ne da ispravljamo sve.
- Stranice nazovite identično Xamarin Forms stranicama i uverite se da su u istom NS-u.

Korak 4 : Za svaku stranicu prekopirajte kod iz Xamarin Forms-a
- Ovo podrazumeva da ne kopirate celu klasu, već sve što se nalazi u ContentPage.Content sekciji i eventualno DataBinding sekciji. Cilj je da kostur klase ostane MAUI, a da samo sadržaj stranice prekopirate
- Isto uradite i za Xaml.cs fajlove, ostavljate kostur klase MAUIa, kopirate sve ostalo
- Dodajte potrebne NS-ove u xaml stranici. Npr: Static klase, ViewModele, ...

Kada ste iskopirali sav kod, možemo preći na resurse :

Korak 5 : Prekopirajte resurse i prilagodite ih MAUIu
- Fontovi : Prebacite ih u Resources/Fonts
- Slike : Prebacite ih u Resources/Images
* Slike moraju pratiti nova pravila imenovanja : mala slova, bez brojeva, spojeno

Korak 6 : Shell
Ukoliko koristite Shell, možete pokušati da iskopirate srž Shell-a iz Xamarin Forms-a u MAUI Shell. Međutim, moja preporuka je da ručno liniju po liniju dodajete u MAUI da bi izbegli probleme sa izmenama koda a da ga naknadno stilizujete kad pokrenete projekat

Izmene

Kada ste baš sve prekopirali u MAUI projekat, možete otvoriti Error tab i videti da sigurno imate preko pedesetak grešaka.
Bitno je da su to greške koje možemo ispraviti migracijom na MAUI a to postižemo na ovaj način "migracije". U suštini, sve ostalo osim nekompatibilnosti treba da radi kada završite prenos koda. Nikakva greška vezana za samo okruženje ne treba da postoji.

Ovaj korak će zavisiti od projekta do projekta i od vašeg koda. Ja ću sada podeliti neke stavke koje su očigledne i na koje sam ja naišao :

- Bilo koji kod koji poziva nešto specifično iz Xamarin.Forms-a Namespace-a će prijviti grešku. Obrišite deklaraciju pri vrhu klase i proverite na koji način to možete da portujete u MAUI (prebacite NS na ekvivalent iz MAUI-a)

- Boje su se promenile u MAUI-u, mnoge metode će ili prijaviti grešku ili će upozoriti da su zamenjene. Uvezite Microsoft.Maui.Graphics.Color i koristite klasu Colors, umesto Color u XF-u.

- DependencyService je izmenjen. Bilo gde u kodu gde ste pozivali neki platform specific kod neće raditi dok se ne prilagodi MAUI-u.

- Xamarin.Forms.Application.Properties je prešao u Microsoft.Maui.Storage.Preferences

- Proverite https://learn.microsoft.com/en-us/dotnet/maui/migration/forms-projects

Bilo kako bilo, grešaka će svakako biti mnogo i čak kad očistite error log, prilikom pokušanja pokretanja aplikacije ćete sigurno dobiti još tonu za XAML i interfejs. Svaku pojedinačno je potrebno regulisati.

Ukoliko nešto trenutno ne možete da regulišete u izgledu stranice, stavite deo koda u komentar, dok ne završite sve ostale ispravke, a onda naknadno prođite kroz kod i izmenite deo interfejsa koji ne odgovara MAUI-u iz bilo kog razloga.

Izmene u izgledu aplikacije

Jednom kada ispravite sve greške, sigurno ćete primetiti da aplikacija ne izgleda kao u Xamarin Forms-u.

Razlog za to je činjenica da je došlo do izmena osnovnih vrednosti u MAUI-u.
Potrebno je da izgled ponovo prilagodite kako bi postigli identičan onom iz XF-a.
Pogledati :
https://learn.microsoft.com/en-us/dotnet/maui/migration/layouts
https://learn.microsoft.com/en-us/dotnet/maui/migr.....marinforms

Fontovi
Fontove koje ste prebacili morate da inicijalizujete slično Xamarin Forms-u :

U MauiProgram.cs :
var builder = MauiApp.CreateBuilder();       builder          .UseMauiApp<App>()          .UseMauiCommunityToolkit()          .UseBarcodeReader()          .ConfigureFonts(fonts =>          {             fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");             fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");          });

Za svaki font iskoristite fonts.AddFont("naziv resursa fonta", "Alias koji koristite za FontFamily");

Slike
- Pošto je došlo do izmena naziva slika, morate u XAML-u da izmenite vaše nazive takođe za svaku sliku pojedinačno

Layout
Layout je pretrpeo neke izmene i ono što je radilo u Xamarin Forms-u neće možda raditi ili izgledati kako treba u MAUI-u dok se ne prilagodi platformi :

CollectionView neće moći da se skroluje u StackLayoutu
- Prebacite ga u Grid, novi StackLayout više ne može da zadrži kontrole već će one da pređu preko granice, samim tim CollectionView će se proširiti van područja StackLayouta iako se ne vidi na uređaju

StackLayout ima dve alternative koje pružaju bolje performanse :
Horizontal Stacklayout
Vertical Stacklayout

Horizontal StackLayout i VerticalStacklayout neće poštovati FillAndExpand više.
Štaviše, koliko sam mogao da pročitam "AndExpand" kao opcija ide u zaborav i trenutno je tu samo zbog migracije. Preporučuju da se koristi Grid

Neki od Layouta i njihovih opcija zahtevaju namespace za kompatibilnost. Moja preporuka je da migrirate na one koji su došli uz MAUI.

Za više informacija o MAUI kontrolama :
https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/


Dve, tri reči o iskustvu

Odmah po startovanju se vidi da je MAUI dosta brži. Skrolovanje kolekcija takođe radi osetno brže. Skoro 95% koda je ostalo netaknuto u mom projektu, ali onih 5% je zahtevalo preko 6 sati izmena.

Trenutno sam u procesu prilagođavanja interfejsa i nakon toga mi ostaje da dobro istestiram aplikaciju pre nego što bih mogao da se usudim da je pustim kao upgrade.

Da li je vredelo? Videću kada završim sve. Za sada mogu reći da je vredelo; činjenice da se aplikacija startuje nekoliko sekundi brže, da kolekcije ne laguju, da su rešeni neki problemi koji su baš smarali u Xamarin Forms-u ali i možda najuticajnija - da HotReload radi 10 puta bolje nego u Xamarin Forms-u, mi daje nadu.

Ne daje mi nadu to što godinu dana nisu ispravili bag u CollectionView kontroli - ne vidi se sidebar.
Nadao sam se da su malo ažurniji po tim nekim osnovnim pitanjima upotrebe.

Bilo kako bilo, dopuniću temu uskoro jer je sada samo kilomter teksta.

P.S.
Ono što mi se skoro desilo :
Applikacija se skršila bez greške samo u slučaju kada je na telefonu instaliran debug build i nije prikačen kablom za VS.
Problem je bio u tome što je postojao event handler iz Xamarina sa pogrešnim parametrima.
Debugger ništa nije prijavio, štaviše radila je app odlično i u Release buildu i u Debugging buildu iz Visual Studia, međutim bez debagera se samo skršila.

Zatim sam zaboravio da sam inicijalizovao naziv slika na jednoj stranici. U debaggingu je aplikacija radila savršeno, međutim kada sam pokušao da testiram stranicu bez VS-a, interefejs je bio prazan.

Zato je bitno proveriti liniju po liniju posle ispravljenih grešaka i dobro istestirati sve jer neke greške neće biti prijavljene od strane Visual Studia, mogu lako da vam potroše sate a vrlo su očigledne - dok ste vi u zabludi da je sve u redu jer VS ne prijavljuje ništa.

Dopuna: 03 Jul 2023 19:13

Rekao bih da je 99% aplikacije prebačeno na MAUI.

Ono što me je zaista šokiralo je činjenica da MAUI .NET 7 ima više bagova u osnovnim kontrolama i funkcionalnostima nego što je to imao Xamarin Forms. Confused

Za neke sam našao zaobilazna rešenja, za neke ću morati da menjam kompletan layout.

Neke od situacija koje su me snašle :

- CollectionView aktivira SelectionChanged event, svaki put kad korisnik prevuče prstom preko unosa u listi.
Prevlači prstom da prikaže dodatne opcije za izmenu unosa... Kritičan bug.

- ListView sa SwipeView kontrolom zadržava stanje SwipeView kontrole dok korisnik skroluje. Rezultat : Otvoriš dodatne stavke za unos u listi, skroluješ dole, otvori se stavka koju nisi otvorio, jer lista reciklira unose. Skroluješ gore, dugmad iz otvorenih stavki nestanu i skrše aplikaciju.

- Grid Layout koji je radio perfektno u Xamarin Forms-u, nekad prosto sakrije sve stavke interfejsa dok korisnik ne klikne tamo gde treba da se vidi dugme. Prvi put radi kako treba, svaki naredni će raditi dva puta u 10 pokušaja.

99% od ovih bagova na koje sam naišao su prebacili u Backlog.

Druže moj, ne radi ti osnovna kontrola koju neko koristi interfejs da napravi, koju si dokumentovao od A do Š, kako to nije prioritet ?

P.S. Ovo je iskustvo sa .net 7.0, možda sam ipak trebao sa šesticom da krenem...



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12400

Godinu dana je prošlo od portovanja ovog projekta u MAUI i videh pre neki dan da je MAUI 8 dobio LTS.
Rekoh, taman da probam sada da konačno prebacim aplikaciju u MAUI i da isprogramiram nove mogućnosti koje sam ubacio u XF projekat u međuvremenu.

Portujem aplikaciju sa .NET 7 na .NET 8 i vidim da nisu ništa popravili od ovih problema na koje sam naišao.

Otvorim Github i pogledam moju prijavu baga, verifikovali su da postoji bag i pomerili ga u backlog posle par meseci i tako stoji tamo. Pogledam nove prijave, milion prijava za osnovne kontrole, pogotovo za collection view.

Baciću pogled na flutter kao mogućnost za portovanje XF aplikacije...



Ko je trenutno na forumu
 

Ukupno su 1013 korisnika na forumu :: 37 registrovanih, 4 sakrivenih i 972 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Ben Roj, ccoogg123, DeerHunter, DejanSt, dekan.m, Djokkinen, Dogma21, draggan, dule10savic, goxsys, Hans Gajger, HrcAk47, Kubovac, kuntalo, laki_bb, mercedesamg, Metanoja, mile23, Mirage 2000N, nebojsag, Nikola00, nnovakis, opt1, pein, raketaš, Rotacioni, Sale.S, tmanda323, tomigun, Toper, Trpe Grozni, vathra, Vladko, Wrangler, šumar bk2, Čivi, 79693