Flutter - konkurencja od Google dla React Native?

4 grudnia 2018 roku miała miejsce sprawa bardzo ważna z punktu widzenia programowania na urządzenia mobilne. Google ogłosiło pierwszą stabilną wersję frameworka Flutter pod numerem 1.0, który służy do tworzenia aplikacji mobilnych na platformy Android oraz iOS (w przyszłości również Fuchsia OS). Chcąc jednak z niego korzystać, musimy poznać język Dart, który będzie służył do tego celu. Google eksperymentował z tym językiem przy tworzeniu aplikacji na Androida już w 2015 roku i kiedyś myślałem, że będzie on w stanie całkowicie zastąpić Javę na tej platformie, ale ostatecznie zastępuje ją Kotlin i, wydaje mi się, że już można tak powiedzieć, jest on głównym językiem programowania na Androida.

Czym jest Flutter?

Otóż Flutter jest frameworkiem do tworzenia frontowej strony aplikacji mobilnej więc mniej więcej tym samym co React Native od Facebooka (pisałem o nim tutaj). Są jednak pewne różnice pomiędzy tymi rozwiązaniami. React Native wykorzystuje natywne komponenty platform, na których działa, a Flutter z założenia dostarcza swoje, napisane w Darcie. W przypadku Fluttera posiadamy na starcie do użycia komponenty w stylu Material Design od Google oraz Human Interface od Apple więc stworzenie dobrze wyglądającej aplikacji, która dodatkowo będzie pasowała do konkretnej platformy mobilnej, z założenia nie powinno być niczym skomplikowanym czy czasochłonnym. Komponenty te są bardzo dobrze odwzorowane i jest bardzo ciężko stwierdzić, że ten komponent nie jest natywny. Bardzo dużym plusem takiego rozwiązania jest to, że bez najmniejszego problemu możemy stworzyć aplikację na Androida, która będzie wyglądała i zachowywała się dosłownie tak samo jak na iOS i na odwrót.

Flutter do działania wykorzystuje bibliotekę graficzną Skia, która sprawia, że jego wydajność jest rewelacyjna i autorzy celują w działanie aplikacji w nawet 120 klatkach na sekundę! To, że Skia jest dobrym silnikiem, niech świadczy również to, że jest on wykorzystywany w takich projektach jak: Google Chrome, Chrome OS, Mozilla Firefox, Android czy edytorze Sublime Text 3.

Flutter już teraz posiada bardzo bogatą liczbę różnego rodzaju bibliotek tworzonych przez społeczność, a ich liczba ciągle rośnie. Katalog z pluginami dla frameworka można znaleźć pod adresem https://pub.dartlang.org/flutter/packages, a na serwisie GitHub znajdziemy również biblioteki wprost od teamu Fluttera: https://github.com/flutter/plugins. Jeśli się dobrze przyjrzymy, dostrzeżemy, że znajdują się tutaj również silniki do tworzenia gier.

Moje doświadczenia związane z Flutterem

Do Fluttera już w pewnym momencie podchodziłem i można powiedzieć, że udało mi się nawet przepisać na niego jedną z moich aplikacji, ale ostatecznie ten projekt został przeze mnie porzucony. Dlaczego tak się stało? W tamtym momencie (było to ponad rok temu) nie widziałem za bardzo dla niego przyszłości i obawiałem się tego, że będzie on tylko kolejnym z wielu eksperymentów Google, który bardzo szybko odejdzie w niepamięć.

Darta można się nauczyć i jeśli miało się styczność z Javą, nie jest to żadnym problemem. Problemem dla mnie natomiast było tworzenie interfejsu samej aplikacji. Byłem bardzo przyzwyczajony do tego, co mamy w Androidzie, czyli pliki XML z layoutami, a pozwoliło mi to bardzo szybko wejść w JSX stosowany w React Native. W Flutterze niestety piszemy wszystko w języku Dart, tworząc nowe obiekty i do tych obiektów w parametrach przekazujemy kolejne obiekty, do nich kolejne i tak dalej. Sprawia to wrażenie bardzo nieeleganckiego kodu z bardzo wieloma poziomami zagłębień. Jest to tak nieczytelne, że IDE z zainstalowanym pluginem do obsługi Fluttera, dodaje nieedytowalne komentarze informujące, gdzie jaki widget się kończy! Stylowanie aplikacji również jest bardzo specyficznym zadaniem i raczej trzeba zapomnieć o nawykach z innych środowisk i nauczyć się wszystkiego na nowo.

Flutter nie miał kiedyś możliwości osadzania natywnych komponentów w interfejsie aplikacji. Był to dla mnie jeden z największych minusów i to właśnie on skreślił dla mnie Fluttera jako framework, który będzie nadawał się do wykorzystania produkcyjnego, ponieważ nie było nawet możliwości osadzenia Map Google (pojawił się plugin od społeczności wyświetlający jedynie mapy statyczne) czy wygodnego wyświetlenia bannerów z sieci reklamowej AdMob (wyświetlane były przez kod natywny nad aplikacją Fluttera). Teraz, po wydaniu wersji 1.0 wydaje się, że sytuacja ulegnie poprawie, ponieważ od twórców otrzymaliśmy widget PlatformView, który umożliwia wyświetlanie właśnie natywnych komponentów, a podczas prezentacji zaprezentowane zostały właśnie Mapy Google we wczesnej jeszcze wersji.

Flutter vs React Native

Ta walka będzie prawdziwie interesująca, ponieważ obie platformy mają dużo plusów. Ostatnio Google bardzo dużo działa marketingowo wokół Fluttera co przekłada się na to, że jest go wszędzie coraz więcej. React Native posiada natomiast przewagę, jeśli chodzi o społeczność, która się wokół niego już skupiła i to, że osoba znająca bibliotekę webową React może przesiąść się w bardzo szybki sposób na React Native. Jednak Google i w tym kierunku przemyślał swoją strategię i zapowiedział również platformę Hummingbird pozwalającą na pisanie aplikacji w Flutterze na weba. Wspomnę jeszcze, że Google poszło dalej i pokazało również Fluttera na desktopy: Linux, macOS i Windows!

Olbrzymim plusem Fluttera, który pozwala mu osiągać rewelacyjną wydajność, jest fakt, że kod powstający w wyniku kompilacji, jest kodem natywnym. W przypadku React Native ciągle mamy do czynienia z JavaScriptem uruchomionym na telefonie, a brak świadomości tego faktu może oznaczać problemy wydajnościowe aplikacji w nim napisanej.

Osobiście jestem bardzo ciekawy, kto ostatecznie wyjdzie cało z tego starcia. Wygra staż React Native czy obietnice Google będą miały swoje odzwierciedlenie w rzeczywistości i Flutter okaże się sukcesem? Ja, ze swojej strony, dam jeszcze szansę Flutterowi i będę śledził, w jakim kierunku będzie się to rozwijało. Przekonuje mnie do tego PlatformView oraz zapowiedź prawdziwej multiplatformowości.