Hoe is het om Flutter te leren als Android developer?

In een vorig artikel kon je lezen hoe je aan Flutter begint vanuit iOS-kennis. In deze blog vervolledigen we het plaatje met de Android-kant! Onze solution lead Yannick neemt je vanuit zijn Android achtergrond mee in zijn ervaringen. Benieuwd hoe moeilijk of gemakkelijk de switch is en waarmee je allemaal rekening moet houden? Read on!

Tekst: Yannick Van Godtsenhoven, Solution Lead bij RMDY

Van imperative naar declarative code

Het grootste verschil voor Android developers die Flutter leren, is de switch van imperative naar declarative programming.

Bij imperative coding bouw je een user interface (UI) die je daarna aanpast vanuit de code. vb. toon een spinner en verberg een lege lijst → haal de items op en voeg die toe aan de lijst, verberg de spinner.

Bij het declarative coding van Flutter is de user interface een functie van de state.
vb. zijn er geen items? Toon dan een spinner. → haal de items op en voeg die toe: de state verandert en de UI wordt opnieuw getekend. Nu zijn er wel items, dus toon een lijst.

Die andere manier van werken is best even wennen, maar eens je het gewoon bent wil je niet meer anders! Nu, de jongere garde Android developers zal daar geen problemen mee hebben gezien Google met Jetpack Compose ook al de declarative code introduceerde bij Android development. De switch van soort coding mag dus eigenlijk geen excuus meer zijn, gezien je op lange termijn sowieso declaratief gaat moeten werken via Jetpack Compose.

User interface in XML vs code

In Android creëer je de user interface in XML (Extensible Markup Language), die je afscheidt van de logica van de code. Simpel gezegd: je ‘tekent’ je interface zonder tussenkomst van code. Bij Flutter is dat anders: de UI wordt gemaakt in code. Gelukkig voelt dit snel heel logisch. En ook hier geldt dat je een streepje voor hebt als je met Jetpack Compose werkt, gezien daar de UI ook in code wordt geschreven. Ook iOS springt trouwens op de UI-in-code-trein met SwiftUI.

Instant Run vs. Hot Reload

Instant Run (Android) en Hot Reload (Flutter) doen eigenlijk hetzelfde: ze zorgen ervoor dat enkel het deeltje van de app dat je aangepast hebt wordt gecompileerd en niet heel de app opnieuw gebuild wordt.

In de praktijk loopt het echter anders. Bij Android moet je toch vaak een volledige rebuild doen, de staat van de app wordt niet bijgehouden en het duurt nog steeds lang.

Bij Flutter daarentegen voelt het echt ‘instant’ aan. Ook de state wordt bijgehouden en dat maakt het dus handiger om te werken. Flutter is natuurlijk niet perfect maar het gaat toch al een pàk sneller dan bij Android.

Dart

Flutter werkt met de programmeertaal Dart. Het is net als Kotlin een moderne taal, dus de verschillen zijn gelukkig niet zo groot.

  • Dart heeft ook nullability
  • De syntax is een beetje anders
  • Uit de praktijk blijkt dat de meeste Android devs zich gemiddeld na een dag al thuis voelen in Dart.
  • Bij Android is het altijd lastig om asynchrone code te schrijven, die uitgevoerd wordt in de achtergrond zonder dat de UI hier blijft op wachten. Bij Flutter is dat niet zo! Gebruik daarvoor ‘Futures’ of ‘Streams’ en heel af en toe eens een ‘Isolate’. Het kan natuurlijk ook wel eens complex worden, maar voor 95% van de gevallen is het heel eenvoudig.

Dezelfde tools

Je kan dezelfde tools gebruiken als die waar je al vertrouwd mee bent: dezelfde IDE, Android Studio, dezelfde plugins in de IDE en dezelfde emulator. Handig!

Heerlijk heldere documentatie

Waar de documentatie van Android regelmatig te wensen overliet of gewoon niet uitgebreid genoeg was, is die van Flutter vanaf de start heel uitgebreid, altijd mooi up-to-date en allemaal verzameld op één plek.

Niemand zal me tegenspreken als ik zeg dat Android documentatie in het begin ronduit slecht was. Doorheen de jaren is die veel beter geworden en ondertussen is ze zelfs zeer uitgebreid. Maar dus goed nieuws: de documentatie van Flutter is vanaf de eerste dag minstens even goed, duidelijk en uitgebreid! 😉

En sinds er Flutter Web is, kan je voorbeelden gewoon in je browser uitproberen en heel snel en gemakkelijk laten zien met bijvoorbeeld Dartpad.dev.

State management chaos

Zoals je al kon lezen, is Flutter declaratief en wordt de UI dus gedeclareerd als een functie van de “state”. Daarom is het heel belangrijk om die state op een overzichtelijke manier te beheren in je app. Daar zijn al enorm veel oplossingen voor bedacht zoals setState, Bloc, Provider, Riverpod, … Net daarom is het als beginner (en zelfs als senior) soms heel moeilijk om door de bomen het bos te zien. Twijfel je over je keuze? Praat met enkele ervaren developers en kies gewoon één state management framework om te beginnen. Bouw er wat ervaring mee op en dan wordt het wel makkelijker om de andere te evalueren. 

En wat met alle opgebouwde Android skills?

Gezien een Flutter app voor Android ook effectief een Android app is, kan je nog heel veel van je Android skills gebruiken. Als er bijvoorbeeld toch eens een speciale integratie met het OS moet gebeuren die nog niemand gemaakt heeft. Of wanneer je toch net met die ene library moet integreren die enkel een native Android SDK heeft die je moet bridgen.

En als je op het einde die Android app moet releasen in Google Play, dan komen die skills ook weer goed van pas natuurlijk.

Nog niet zeker of je wel wil beginnen of waar te beginnen?

Google heeft een hele pagina geschreven specifiek voor Android developers over hoe belangrijke Android concepten vertaald worden in Flutter: Flutter for Android developers

What’s next? 👀

Next up in onze Product Studio-reeks: welke stappen zijn er nodig om een set-up te doen in Flutter?

Stuur ons een mailtje en
let’s talk!

RMDY NV
Veldkant 35A
2550 Kontich

T: +32 3 450 86 42
E: info@rmdy.be