{"id":12881,"date":"2022-02-23T08:20:07","date_gmt":"2022-02-23T07:20:07","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=12881"},"modified":"2023-05-30T15:37:48","modified_gmt":"2023-05-30T13:37:48","slug":"xamarin-forms-i-co-dalej","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/xamarin-forms-i-co-dalej\/","title":{"rendered":"Xamarin.Forms\u2026 i co dalej?"},"content":{"rendered":"\n<p>Na pocz\u0105tku roku 2021 roku Microsoft przedstawi\u0142 \u015bwiatu najnowsz\u0105 i zarazem ostatni\u0105 wersj\u0119 frameworka Xamarin.Forms, oznaczon\u0105 numerem 5.0. Tym samym \u201eFormsy\u201d, jak je czasami pieszczotliwie okre\u015blam, powoli ko\u0144cz\u0105 sw\u00f3j cykl \u017cycia i jeszcze tylko do listopada 2022 roku, b\u0119d\u0105 otrzymywa\u0142y nowe funkcjonalno\u015bci oraz poprawki.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co\u015b si\u0119 ko\u0144czy, co\u015b si\u0119 zaczyna\u2026<\/h2>\n\n\n\n<p>I mogliby\u015bmy w zasadzie przej\u015b\u0107 nad tym do porz\u0105dku dziennego, gdyby nie jeden ma\u0142y szkopu\u0142. Mamy luty 2022, a o finalnej wersji MAUI (nast\u0119pcy Xamarin.Forms) ani widu, ani s\u0142ychu. Gdzie\u015b tam, w czelu\u015bciach Internetu, mo\u017cna natrafi\u0107 na informacj\u0119, \u017ce wszystko zmieni si\u0119 w ju\u017c II kwartale bie\u017c\u0105cego roku, czyli ca\u0142kiem nied\u0142ugo. Jednak obecnie, od ponad 12 miesi\u0119cy, jeste\u015bmy zmuszeni do wykorzystywania czego\u015b, co wkr\u00f3tce przestanie by\u0107 rozwijane.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nowe projekty \u2013 co z nimi?<\/h3>\n\n\n\n<p>Startuj\u0105c z nowym mobilnym projektem w \u015brodowisku .NET, albo skorzystamy z wersji beta MAUI, albo, ju\u017c na starcie, ska\u017cemy si\u0119 na technologi\u0119, kt\u00f3ra w bliskiej przysz\u0142o\u015bci nie b\u0119dzie wspierana. Oczywi\u015bcie, stare aplikacje napisane w Formsach, wed\u0142ug zapowiedzi Microsoftu, b\u0119dzie mo\u017cna <strong>automatycznie migrowa\u0107 do MAUI<\/strong> poprzez dedykowane narz\u0119dzie <strong><em>.NET Upgrade Assistant<\/em><\/strong>.<\/p>\n\n\n\n<p>Czy to si\u0119 sprawdzi zgodnie z zapowiedziami tw\u00f3rc\u00f3w? Mam co do tego spore w\u0105tpliwo\u015bci\u2026 i cich\u0105 nadziej\u0119, \u017ce nie sko\u0144czy si\u0119 na aplikacjach typu \u201eHello World\u201d.<\/p>\n\n\n\n<p>Nowe projekty w Xamarin.Forms ca\u0142y czas powstaj\u0105 i jeszcze jaki\u015b czas b\u0119d\u0105 powstawa\u0107. Oficjalna premiera <strong>Visual Studio 2022<\/strong> i MAUI raczej niewiele tutaj zmieni. Aczkolwiek, z mojego developerskiego punktu widzenia, to mimo ryzyka bug\u00f3w i niedoci\u0105gni\u0119\u0107, jednak chcia\u0142bym jak najszybciej mie\u0107 t\u0119 przesiadk\u0119 za sob\u0105.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nowo\u015b\u0107 goni nowo\u015b\u0107 \u2013 prezentacja narz\u0119dzi<\/h3>\n\n\n\n<p>W temacie budowy aplikacji mobilnych Apple zaprezentowa\u0142 <strong>Swift UI<\/strong>, Google wycofa\u0142 si\u0119 z Javy na rzecz <strong>Kotlina<\/strong>, do gry wszed\u0142 Flutter i <strong>React Native<\/strong>, a Microsoft pracuje nad <strong>MAUI<\/strong>. W ostatnim czasie naprawd\u0119 sporo si\u0119 dzieje. Nie mo\u017cna r\u00f3wnie\u017c zapomnie\u0107 o premierze <strong>nowej wersji .NET-a<\/strong>, kt\u00f3ry jest \u201efundamentem\u201d Xamarina i Maui.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">.NET 5<\/h2>\n\n\n\n<p>.NET 5 to kolejny krok do ulepszenia .NET Core i stworzenia <strong>multiplatformowej technologii<\/strong>. Wprowadza on kilka kluczowych zmian, poprawki wydajno\u015bci, aktualizacj\u0119 F# oraz, co najwa\u017cniejsze, now\u0105 wersj\u0119 C# (oznaczon\u0105 numerem 9.0).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kluczowe zmiany<\/h3>\n\n\n\n<p>Kilka nowo\u015bci jakie rzuci\u0142y mi si\u0119 w oczy to mi\u0119dzy innymi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8211; s\u0142\u00f3wko kluczowe init umo\u017cliwiaj\u0105ce sprawne tworzenie w\u0142a\u015bciwo\u015bci mo\u017cliwych tylko do inicjalizacji:  <\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\npublic string MyName { get; init; }\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>nowa definicja rekord\u00f3w (obiekt\u00f3w, kt\u00f3re sk\u0142adaj\u0105 si\u0119 w ca\u0142o\u015bci z niemutowalnych w\u0142a\u015bciwo\u015bci), przy wykorzystaniu s\u0142owa kluczowego data: <\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\npublic data class Invoice { public string Number { get; init; } }\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>wyra\u017cenie with wykorzystywane do kopiowania obiekt\u00f3w rekord\u00f3w:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nvar secondInvoice = invoice with { Number = \u201d1\/1\/2022\u201d }\n<\/pre><\/div>\n\n\n<p>A na koniec taka ciekawostka:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>nowy spos\u00f3b deklaracji funkcji main, bez zagnie\u017cd\u017cenia si\u0119 i z mniejsz\u0105 ilo\u015bci\u0105 kodu:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nusing System; Console.WriteLine(\u201dHello World\u201d);\n<\/pre><\/div>\n\n\n<p>Zmian jest ca\u0142kiem du\u017co \u2013 je\u015bli ten temat interesuje Ci\u0119 nieco bardziej, to odsy\u0142am do <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/core\/whats-new\/dotnet-5#f-updates\" rel=\"nofollow\" >dokumentacji<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MAUI \u2013 czego mo\u017cemy oczekiwa\u0107?<\/h2>\n\n\n\n<p>Podobnie jak Xamarin.Forms, .NET MAUI jest wieloplatformow\u0105 platform\u0105 typu open source do tworzenia aplikacji mobilnych i stacjonarnych.<\/p>\n\n\n\n<p>B\u0119dzie wspiera\u0142a:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Android,<\/li>\n\n\n\n<li>iOS,<\/li>\n\n\n\n<li>macOS (poprzez Mac Catalyst);<\/li>\n\n\n\n<li>Windows.<\/li>\n<\/ul>\n\n\n\n<p>MAUI obiecuje r\u00f3wnie\u017c g\u0142\u0119bsz\u0105 integracj\u0119 z innymi narz\u0119dziami i us\u0142ugami firmy Microsoft. I ostatecznie \u2013 lepsz\u0105 wydajno\u015b\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ewolucja Xamarin.Forms<strong><br><\/strong><\/h3>\n\n\n\n<p>.NET Multiplatform App UI (.NET MAUI) to nic innego jak ewolucja \u201eznienawidzonych\u201d przez wielu programist\u00f3w Xamarin.Forms. Ka\u017cdy, kto kiedy\u015b pisa\u0142 aplikacje w Xamarin, na pewno natkn\u0105\u0142 si\u0119 na <strong>wiele problem\u00f3w<\/strong> zwi\u0105zanych, mi\u0119dzy innymi, z <strong>dostarczonymi kontrolkami<\/strong>. Problemy te podobno maj\u0105 zosta\u0107 wyeliminowane ju\u017c wkr\u00f3tce. Z jakim skutkiem? To si\u0119 jeszcze oka\u017ce.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zalety .NET MAUI<strong><br><\/strong><\/h3>\n\n\n\n<p>Dzisiaj mo\u017cna powiedzie\u0107, \u017ce niew\u0105tpliwie g\u0142\u00f3wn\u0105 zalet\u0105 MAUI jest <strong>rozszerzenie jego funkcjonalno\u015bci na wszystkie systemy operacyjne<\/strong> (Android, iOS, macOS, Windows). Ca\u0142a <strong>struktura kodu zosta\u0142a uproszczona<\/strong> do pojedynczego projektu dedykowanego dla ka\u017cdego wspieranego \u015brodowiska. Grafiki, czcionki, pliki t\u0142umacze\u0144, mo\u017cna stworzy\u0107 raz, a .NET MAUI automatycznie skonfiguruje wszystko tak, aby dzia\u0142a\u0142o identycznie, niezale\u017cnie od posiadanego systemu operacyjnego.<\/p>\n\n\n\n<p>Oczywi\u015bcie, z punktu widzenia programisty, <strong>dost\u0119p do natywnych interfejs\u00f3w API<\/strong> zosta\u0142 w ca\u0142o\u015bci zachowany (.NET for Android i .NET for iOS). Nie zapominajmy r\u00f3wnie\u017c o zapowiadanej poprawie wydajno\u015bci, co niew\u0105tpliwie powinno pozytywnie wp\u0142yn\u0105\u0107 na odbi\u00f3r aplikacji przez u\u017cytkownik\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hot Reolad<\/h3>\n\n\n\n<p>Nie tak dawno temu, podczas pracy nad aplikacjami mobilnymi w Xamarin, w przypadku modyfikacji interfejsu u\u017cytkownika, chc\u0105c pozna\u0107 efekt zmian, musieli\u015bmy ponownie kompilowa\u0107 ca\u0142y projekt.<br>\u0141atwo sobie wyobrazi\u0107, jak bardzo wyd\u0142u\u017ca\u0142o to prac\u0119 i frustrowa\u0142o developer\u00f3w. Drobna modyfikacja layoutu i kilka lub kilkana\u015bcie minut oczekiwania, aby dowiedzie\u0107 si\u0119, \u017ce\u2026 asset jednak m\u00f3g\u0142by zosta\u0107 przesuni\u0119ty kawa\u0142ek w prawo. Uff\u2026<\/p>\n\n\n\n<p>Te czasy, na szcz\u0119\u015bcie, mamy ju\u017c dawno za sob\u0105, a obecnie <strong>modyfikacja kodu XAML<\/strong> nie wymaga ponownej budowy ca\u0142ej aplikacji. Microsoft zdecydowanie u\u0142atwi\u0142 nam \u017cycie, ale nie zrobi\u0142 tego wsz\u0119dzie, gdzie powinien.<\/p>\n\n\n\n<p>Drobne modyfikacje cz\u0119\u015bci odpowiadaj\u0105cej za <strong>logik\u0119 biznesow<\/strong>\u0105 w dalszym ci\u0105gu wymagaj\u0105 od nas ponownej kompilacji projektu. Tutaj z zazdro\u015bci\u0105 mo\u017cemy popatrze\u0107 na Fluttera czy React Native, kt\u00f3re oferuj\u0105 pe\u0142ne wsparcie dla Hot Reolad.<\/p>\n\n\n\n<p>Na szcz\u0119\u015bcie wszystko ma si\u0119 zmieni\u0107 w .NET MAUI, kt\u00f3ry, wed\u0142ug zapowiedzi, ma w pe\u0142ni wspiera\u0107 t\u0119 funkcjonalno\u015b\u0107. Witamy Xamarina w XXI wieku!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MVVM<\/h3>\n\n\n\n<p>Obecnie, powszechnie wykorzystywanym wzorcem architektonicznym do budowy aplikacji mobilnych w Xamarin jest <strong>MVVM (ang. <em>Model-View-ViewModel<\/em>)<\/strong>. W MAUI b\u0119dzie on nadal wspierany i rozwijany. Nie to jest jednak w tym wszystkim najciekawsze\u2026<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MVU<\/h3>\n\n\n\n<p>To, co najbardziej nas interesuje, to <strong>natywne wsparcie dla wzorca <em>Model-View-Update<\/em> (MVU),<\/strong> wykorzystywanego do budowy interfejs\u00f3w u\u017cytkownika za pomoc\u0105 kodu. Moim zdaniem to w\u0142a\u015bnie jest najwi\u0119ksza rewolucja, jak\u0105 ma zaoferowa\u0107 nam nast\u0119pca Forms\u00f3w. Warto r\u00f3wnie\u017c doda\u0107, \u017ce takie podej\u015bcie do budowy aplikacji mobilnych nie jest nowe. Microsoft stara si\u0119 tutaj nieco dogoni\u0107 Apple, kt\u00f3ry to ju\u017c w 2019 roku zaprezentowa\u0142 \u015bwiatu Swift UI, wysy\u0142aj\u0105c UI Kit na zas\u0142u\u017con\u0105 emerytur\u0119.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kilka s\u0142\u00f3w podsumowania<\/h2>\n\n\n\n<p>Jak to b\u0119dzie wygl\u0105da\u0142o w praktyce? Zamiast tworzy\u0107 interfejsy u\u017cytkownika przy wykorzystaniu dobrze znanych tag\u00f3w XAML, wszystko b\u0119dziemy mogli wykona\u0107 z poziomu kodu C#. Rozwi\u0105zanie zdecydowanie bardziej intuicyjne i daj\u0105ce nieco wi\u0119ksze mo\u017cliwo\u015bci.<\/p>\n\n\n\n<p>Taki spos\u00f3b budowy aplikacji mobilnych przemawia do mnie zdecydowanie bardziej, ni\u017c budowa UI przy wykorzystaniu \u201ezmodyfikowanych\u201d tag\u00f3w HTML-a.<\/p>\n\n\n\n<p><strong>A jakie jest Twoje zdanie?<\/strong><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;12881&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;9&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.6&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.6\\\/5 ( votes: 9)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Xamarin.Forms\u2026 i co dalej?&quot;,&quot;width&quot;:&quot;127.9&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 127.9px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.6\/5 ( votes: 9)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Na pocz\u0105tku roku 2021 roku Microsoft przedstawi\u0142 \u015bwiatu najnowsz\u0105 i zarazem ostatni\u0105 wersj\u0119 frameworka Xamarin.Forms, oznaczon\u0105 numerem 5.0. Tym samym &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/xamarin-forms-i-co-dalej\/\">Continued<\/a><\/p>\n","protected":false},"author":335,"featured_media":12883,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[287,129,696,413],"class_list":["post-12881","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-software-development","tag-c","tag-digital-competency-center","tag-xamarin"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/02\/Xamarin.Forms-i-co-dalej_.png","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/12881"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/335"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=12881"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/12881\/revisions"}],"predecessor-version":[{"id":22058,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/12881\/revisions\/22058"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/12883"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=12881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=12881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=12881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}