Kodėl Flutter tapo tokiu populiariu pasirinkimu
Kai prieš kelerius metus Google pristatė Flutter, daugelis skeptikų manė, kad tai bus dar vienas trumpalaikis technologijų hype’as. Tačiau realybė parodė ką kita – Flutter ne tik išliko, bet ir tapo vienu iš pagrindinių įrankių mobiliųjų aplikacijų kūrimui. Šiandien jį naudoja tiek startuoliai, tiek tech gigantai kaip Alibaba, BMW ar eBay.
Pagrindinis Flutter privalumas slypi jo gebėjime kurti tikrai native atrodančias aplikacijas tiek iOS, tiek Android platformoms naudojant vieną kodų bazę. Skamba kaip sena daina, kurią girdėjome su Cordova, React Native ir kitais cross-platform sprendimais, tiesa? Bet Flutter daro tai kitaip. Vietoj to, kad pasikliautų native komponentais ar JavaScript tiltais, Flutter turi savo rendering engine’ą, kuris piešia kiekvieną pikselį ekrane. Tai reiškia, kad jūsų aplikacija atrodys vienodai gerai ir veiks stabiliai abiejose platformose.
Dart programavimo kalba, kuria parašytas Flutter, iš pradžių gali atrodyti kaip dar vienas dalykas, kurį reikia išmokti. Bet jei turite patirties su Java, JavaScript ar Swift, įsisavinti Dart sintaksę užtruks gal savaitę. O kai pradėsite dirbti su hot reload funkcija, kuri leidžia matyti pakeitimus beveik akimirksniu, suprasite, kodėl tiek daug developerių perėjo prie Flutter.
Kaip pradėti: pirmieji žingsniai su Flutter
Pradėti su Flutter yra gana paprasta, nors pradinė setup’o procedūra gali užtrukti. Pirmiausia reikės įdiegti Flutter SDK – tai galima padaryti per oficialią svetainę flutter.dev. Priklausomai nuo jūsų operacinės sistemos, procesas šiek tiek skiriasi, bet dokumentacija yra tikrai išsami.
Jums taip pat prireiks Android Studio arba Xcode (jei dirbate su macOS), kad galėtumėte testuoti aplikacijas. Taip, tai reiškia, kad iOS aplikacijų kūrimui vis tiek reikės Mac kompiuterio – Flutter neišsprendžia šios amžinos problemos. Bet bent jau kodą rašysite vieną kartą.
Kai viskas įdiegta, rekomenduoju paleisti komandą flutter doctor terminale. Ši komanda patikrina jūsų aplinką ir parodo, ko dar trūksta. Tai vienas iš tų mažų dalykų, kurie daro Flutter tokį developer-friendly – sistema pati pasako, ką reikia sutvarkyti.
Pirmąją aplikaciją galite sukurti su flutter create mano_app komanda. Tai sugeneruos visą reikalingą projektų struktūrą su demo aplikacija, kuri rodo, kaip veikia counter funkcionalumas. Gali atrodyti primityviai, bet šis pavyzdys puikiai iliustruoja Flutter pagrindus: kaip veikia stateful widgetai, kaip atnaujinamas UI, kaip organizuojamas kodas.
Widget’ai – viskas yra widget’as
Flutter filosofija yra paprasta: viskas yra widget’as. Mygtukas? Widget’as. Tekstas? Widget’as. Layout’as? Taip pat widget’as. Net visa jūsų aplikacija iš esmės yra widget’ų medis. Iš pradžių tai gali atrodyti keista, ypač jei ateinat iš native iOS ar Android kūrimo pasaulio, bet greitai suprasite, kad ši sistema yra labai logiška ir galinga.
Yra du pagrindiniai widget’ų tipai: StatelessWidget ir StatefulWidget. Stateless widget’ai yra tie, kurie nesikeičia – pavyzdžiui, paprastas tekstas ar ikona. Stateful widget’ai turi būseną, kuri gali keistis – pavyzdžiui, forma, kurioje vartotojas įveda duomenis, arba sąrašas, kuris gali būti atnaujinamas.
Praktikoje dauguma jūsų widget’ų bus stateless, o būsenos valdymą perkelsite į state management sprendimus kaip Provider, Riverpod ar Bloc. Tai padeda išlaikyti kodą švarų ir lengvai testuojamą. Pavyzdžiui, vietoj to, kad turėtumėte sudėtingą StatefulWidget su daugybe setState() iškvietimų, galite turėti paprastą StatelessWidget, kuris tik atvaizduoja duomenis iš state management layer’io.
Layout’ai ir dizaino realizacija
Vienas iš dalykų, kuris Flutter išskiria iš kitų framework’ų, yra tai, kaip lengva realizuoti sudėtingus dizainus. Material Design komponentai ateina iš dėžės, o jei kuriate iOS aplikaciją, galite naudoti Cupertino widget’us, kurie atrodo kaip native iOS elementai.
Bet tikroji Flutter galia atsiskleidžia, kai pradedate kurti custom UI. Kadangi Flutter piešia kiekvieną pikselį pats, jūs neribojami platform’os native komponentų. Norite animuoto gradient fono su custom shaped mygtukais? Nėra problemos. Reikia sudėtingo gesture’ų valdymo? Flutter turi puikią GestureDetector klasę.
Layout’ai Flutter’yje kuriami naudojant composition principą. Turite Column ir Row widget’us baziniam išdėstymui, Stack widget’ą elementų sluoksniavimui, Container widget’ą padding’ui ir margin’ui. Iš pradžių gali atrodyti, kad kodas tampa gana įdubintas (nested), bet su praktika išmoksite organizuoti widget’us į mažesnius, perpanaudojamus komponentus.
Štai konkretus patarimas: kai jūsų widget’o build metodas tampa ilgesnis nei 50 eilučių, laikas jį suskaidyti į mažesnius widget’us. Tai ne tik pagerina kodo skaitomumą, bet ir optimizuoja performance – Flutter gali efektyviau rebuild’inti mažesnius widget’us.
State management dilema
Jei paklausite dešimties Flutter developerių, kokį state management sprendimą naudoti, greičiausiai gausite dešimt skirtingų atsakymų. Tai viena iš sričių, kur Flutter bendruomenė neturi vieningos nuomonės, ir tai yra tiek privalumas, tiek iššūkis.
Pradedantiesiems rekomenduoju pradėti nuo Provider – tai oficialiai rekomenduojamas sprendimas, kuris yra gana paprastas suprasti. Provider leidžia „provide” duomenis žemyn widget’ų medyje be to, kad reikėtų perduoti juos per konstruktorius per visus tarpiniuos widget’us.
Kai jūsų aplikacija auga, galbūt norėsite pažvelgti į Riverpod (Provider evoliucija) arba Bloc pattern’ą. Bloc yra ypač populiarus tarp developerių, ateinančių iš enterprise pasaulio, nes jis primena Redux ir panašius sprendimus. Jis gali atrodyti per daug sudėtingas mažoms aplikacijoms, bet didelėse komandose jo struktūra ir testability yra neįkainojami.
GetX yra dar vienas populiarus pasirinkimas, kuris siūlo ne tik state management, bet ir routing, dependency injection ir kitus utility. Bet būkite atsargūs – GetX turi tendenciją tapti „god object”, kuris daro per daug dalykų, ir kai kurie developeriai vengia jo dėl šios priežasties.
Darbas su API ir duomenų valdymas
Realios aplikacijos retai kada egzistuoja izoliacijoje – jos bendrauja su backend’ais, vartoja API, saugo duomenis lokaliai. Flutter turi puikų ekosistemą paketų, kurie padeda su visais šiais dalykais.
HTTP užklausoms dažniausiai naudojamas http arba dio paketas. Dio yra galingesnis ir turi daugiau funkcionalumo out of the box – interceptors, automatic JSON serialization, timeout handling. Jei kuriate ką nors rimtesnio nei todo aplikacija, Dio yra geresnis pasirinkimas.
JSON serialization Flutter’yje nėra tokia automatinė kaip, pavyzdžiui, JavaScript’e. Turite du pagrindinius pasirinkimus: rankinis serialization arba code generation su json_serializable paketu. Rankinis būdas yra paprastesnis mažoms aplikacijoms, bet kai turite dešimtis modelių, code generation sutaupo daug laiko ir išvengia klaidų.
Lokaliam duomenų saugojimui turite kelis pasirinkimus priklausomai nuo poreikių. shared_preferences tinka paprastiems key-value porams. sqflite yra SQL duomenų bazė, jei reikia sudėtingesnių užklausų. O hive arba isar yra modernūs NoSQL sprendimai, kurie yra labai greiti ir lengvi naudoti.
Testing ir debugging Flutter aplikacijose
Vienas iš Flutter stipriųjų pusių yra testing infrastructure. Framework’as buvo sukurtas su testing’u omenyje, ir tai matyti. Galite rašyti unit testus, widget testus ir integration testus – visi jie veikia greitai ir yra lengvai rašomi.
Widget testing yra ypač galingas Flutter’yje. Galite „pump” widget’ą į test aplinką, simuliuoti user interaction’us, tikrinti ar teisingi elementai atvaizduojami. Tai daug greitesnis būdas testuoti UI logiką nei paleisti visą aplikaciją emuliatoriuje.
Debugging’ui Flutter turi puikius įrankius. Flutter DevTools yra web-based debugging suite, kuris leidžia inspektuoti widget’ų medį, analizuoti performance, stebėti network užklausas. Hot reload funkcija reiškia, kad dažnai net nereikia debugger’io – tiesiog padarote pakeitimą ir iš karto matote rezultatą.
Vienas patarimas, kurį norėčiau pasidalinti: naudokite debugPrint() vietoj print(). Tai atrodo kaip smulkmena, bet debugPrint automatiškai tvarko ilgas žinutes, kurios kitaip būtų nupjaunamos Android logcat’e.
Performance optimizacija ir best practices
Flutter aplikacijos gali būti labai greitos, bet tai nereiškia, kad jos automatiškai tokios bus. Yra keletas dalykų, į kuriuos reikia atkreipti dėmesį, kad jūsų aplikacija veiktų sklandžiai.
Pirma, venkit bereikalingo rebuild’inimo. Kai keičiasi būsena, Flutter rebuild’ina widget’ų medį, bet jis yra gana protingas ir rebuild’ina tik tai, kas pasikeitė. Tačiau jei jūsų widget’ų struktūra nėra optimali, galite priversti Flutter rebuild’inti daugiau nei reikia. Naudokite const konstruktorius kur tik įmanoma – tai pasako Flutter, kad widget’as niekada nepasikeis ir jo nereikia rebuild’inti.
Sąrašams su daug elementų visada naudokite ListView.builder arba GridView.builder. Šie konstruktoriai kuria tik tuos elementus, kurie matomi ekrane, vietoj to, kad kurtų visus iš karto. Tai gali būti skirtumas tarp smooth scrolling ir laggy patirties.
Images yra kitas performance bottleneck. Naudokite cached_network_image paketą vietoj standartinio Image.network – jis automatiškai cache’ina paveikslėlius ir rodo placeholder’ius kol jie kraunasi. Taip pat įsitikinkite, kad jūsų images yra tinkamo dydžio – nėra prasmės krauti 4K paveikslėlio, jei jis bus rodomas kaip thumbnail’as.
Kas toliau: Flutter ateitis ir ekosistema
Flutter bendruomenė auga eksponentiškai, ir tai reiškia vis daugiau paketų, tutorial’ų ir resursų. Bet tai taip pat reiškia, kad kartais sunku atsirinkti, ką naudoti. Kai ieškote paketo, žiūrėkite ne tik į žvaigždučių skaičių GitHub’e, bet ir į tai, ar jis aktyviai prižiūrimas, ar turi gerą dokumentaciją, ar palaiko null safety.
Flutter 3.0 įvedė stable Windows, macOS ir Linux palaikymą, o tai reiškia, kad dabar galite kurti ne tik mobiliąsias, bet ir desktop aplikacijas su tuo pačiu kodu. Web palaikymas taip pat egzistuoja, nors jis dar nėra toks brandus kaip mobile. Realybė yra ta, kad Flutter geriausiai veikia mobile platformose, bet galimybė palaikyti kitas platformas su minimaliomis pastangomis yra didelis privalumas.
Google investuoja į Flutter rimtai – jie jį naudoja savo produktuose ir nuolat prideda naujas funkcijas. Fuchsia OS, Google eksperimentinė operacinė sistema, naudoja Flutter kaip pagrindinį UI framework’ą. Tai rodo, kad Flutter nėra trumpalaikis projektas.
Jei tik pradedate su Flutter, neišsigąskite pradinio learning curve. Taip, yra daug naujų konceptų, bet bendruomenė yra draugiška ir dokumentacija yra puiki. Pradėkite nuo mažų projektų, eksperimentuokite, skaitykite kitų kodą. Flutter leidžia kurti gražias, greitai veikiančias aplikacijas, ir kai įvaldysite pagrindus, produktyvumas tikrai išaugs. Nebijokite klysti – hot reload reiškia, kad galite greitai bandyti skirtingus sprendimus ir matyti, kas veikia geriausiai. Ir svarbiausia – mėgaukitės procesu, nes Flutter tikrai gali būti labai malonus įrankis dirbti.
