Flutter mobil app fejlesztés – 1. Alapok

Mi a Flutter?

A Flutter egy UI kit a Google-től, ami a cross-platformos fejlesztést támogatja Android-ra, iOS-re, Web-re, asztali alkalmazásokra (Desktop). A Flutter 2017-ben került először a nagyközönség elé.

A keretrendszer nyelve a Dart, ami mai modern alapokra épít. Nagyban hasonlít a C# és a Java nyelvekre, így könnyedén elsajátítható.

Minden Widget!

A Flutter-ben (majdnem) minden egy widget. A widget egy UI komponens (egy view), ami építőkockánkét állítja össze a felületet. A Flutter keretrendszerben a UI-t deklaratív módon kell leírnunk, egy un. widget tree-hez hasonlóan. Természetesen a valóságban ennél sokkal egyszerűbb a helyzetünk 🙂

Flutter widget tree
Widget tree

A képernyő minden egyes pixelje módosítható a saját igényeink szerint. Nem építkezik a natív OS UI komponenseire, ehelyett teljesen szabad kezet kapunk a kialakításukban.

Stateful vs Stateless widget

Két alap típusa van egy felületi elemnek: az állapot nélküli (Stateless) és az állapottal rendelkező (Stateful) widget.

Stateless widget: immutable object. Egy rajzlaphoz hasonlít: ami egyszer odakerült, az nem módosul rajta.

Stateful widget: egy Stateless objektum állapotát és így kinézetét meg lehet változtatni metódusokon keresztül. A beépített metódus a setState() hívása.

A Flutter State management-ről. De nem ez a lényeg!

Egy Flutter mobil alkalmazás kinézete egy állapottal írható le:

UI = f(states)

A Flutter fejlesztői körökben nagyon sok vita van arról, hogy melyik a “legjobb” “State management” megoldás, és heves vitákat vált ki, azonban nem ez a legfontosabb!

Nagyon fontos megérteni az állapotkezelést, azonban egy kisméretű alkalmazásnál elegendő a meglévő, a keretrendszer nyújtotta lehetőségek (StatefulWidget).

Kódoljunk!

A cél, hogy egy egyszerű appon keresztül megnézzük a Flutter erősségeit és lehetőségeit.

Flutter simple demo app screencast
Demo app

GitHub repo: https://github.com/vborbely/english_words

A Flutter Codelab, amit használtam a demóhoz:

A kód felépítése:

  • lib könyvtár: az össes, Dart nyelven megírt kód ez alá lesz szervezve: üzleti logika, UI, Helpers, stb.
  • pubspec.yaml file : a mobil app által használt package-k verziókövetett lenyomata; generátorok; egyéb függőségek helye
  • android, ios, web, macos, linux, windows könyvtárak : minden, ami a natív build-hez kell; natív kódrészletek (ritkán lesz rá szükségünk)
  • main.dart file : alapértelmezett belépési pontja az appnak

Teszteljünk!

Unit tesztelés

A tesztelés legalapvetőbb része. Mockito package használható rá.

Integration tesztelés

Célja, hogy a teljes alkalmazást vagy annak egy nagy részét tesztelje. A tesztelés célja, hogy meggyőződjön róla, hogy a widget-ek és az servicek (BackEnd, API-k, stb.) jól működnek együtt.

Általában valódi eszközön, vagy emulátorban (iOS Simulator, Android Emulator) fut a teszt, hogy kiküszöbölje a keretrendszer torzításait.

Automatizálás céljából integrálható a Firebase Test Lab-bal.

Widget (Component) tesztelés

Egy widgetet tesztelhetünk vele.

A widget tesztelésnek 2 féle módja van:

  • egyszerű widget teszt, amikor egy UI elem meglétét, tesztelhetjük.
    Pl. létezik-e egy text widget, amiben egy számláló értéke 2
  • Golden sample képfile alapján. Ez lehetőséget ad az appunk pixel pontos tesztelésére. Előre generált minta képhez hasonlítja a teszt során létrejövő UI felületről készített képeket.
    Megjelöli a hibás részleteket vizualizálva és ezáltal könnyebbé téve a kiértékelését.

Tesztelés minta app: https://github.com/vborbely/bdd_showcase_app

Ezeket tanultuk

  • Package függőség behúzása és importálása
  • File-ok szervezése különösen fontos, ahogyan az app növekszik
  • Lehetőleg 1 Widget – 1 file mintát kövessük. Ha lehet, használjuk fel többször egy widget-et
  • használjuk a const és final kulcsszavakat, ahol csak lehet
  • figyeljünk oda a platform specifikus részekre. Pl. iOS-en nincsen fizikai back button, ezért a navigációs stack-et kezelni kell (visszanyíl)
  • az automatizált tesztelés változatosan elvégezhető

Tooling

IDE-k

Minden fontos IDE-nek számos, Flutter és Dart kiegészítő pluginja telepíthető.

  • JetBrains IntelliJ IDEA / Android Studio
  • VSCode

CodePen

CI / CD folyamatok

  • Bitrise.io (HUN)
  • CodeMagic.io
  • GitHub Actions

Gyakran használt parancsok

Néhány alapvető parancs, amikre naponta szükséged lehet. A jó hír viszont, hogy ennél többre nem lesz szükséged.

ParancsMűködés
flutter doctora fejlesztői környezet konfigurációit írja ki
flutter cleantörli a build-eléshez tartozó cache állományokat
flutter pub getújratölti a függőségeket, felépíti a cache állományokat
flutter pub run build_runner build --delete-conflicting-outputsfuttatja a generátorokat, amik létrehozzák az osztályokat. Teljesen újragenerálja az osztályokat
flutter pub run build_runner watchua., mint a fenti, de csak a változásokat kutatja fel, és frissíti
flutter build [appbundle | ios ]bináris állományt készít a projektből Androidra vagy iOS-re
flutter run -daz app-ot release módban elindítja az eszközön, a -d kapcsoló utáni beállítástól függően
flutter pub addegy package függőség hozzáadása a pubspec.yaml fileba
Gyakori Flutter CLI parancsok

Hasznos linkek

További cikkeim Flutter témában