Flutter (softvér)

**Flutter** je open-source používateľské rozhranie SDK na vývoj softvéru, vytvorené spoločnosťou Google. Používa sa na vývoj aplikácií pre Android, iOS, Windows, MacOS, Linux, Google Fuchsia a web.

Prvá verzia Flutter bola známa pod označením „Sky“ a bežala na operačnom systéme Android. Bola odhalená na vývojárskom samite Dartu v roku 2015, s tým, že je možné v tejto verzii Flutteru vykresliť na obrazovku 120 snímkov za sekundu konzistentnou rýchlosťou. Hlavnou témou počas Google Developer Dní v Šanghaji bolo oznámenie ukážky vydania Flutter Release 2 spoločnosťou Google, čo predstavovalo posledné veľké vydanie pred oficiálnou verziou Flutter 1.0. Následne 4. decembra 2018 bola na podujatí Flutter Live vydaná verzia Flutter 1.0, ktorá označuje prvú „stabilnú“ verziu tohto Frameworku. 11. decembra 2019 bola na udalosti Flutter Interactive vydaná verzia Flutter 1.12.

## Architektúra frameworku
Medzi hlavné komponenty Flutteru patria:
* Platforma Dart
* Flutter modul
* Základná knižnica
* Dizajnovo špecifické widgety

### Platforma Dart
Flutter aplikácie sú napísané v jazyku Dart a využívajú mnohé pokročilejšie funkcie jazyka.

V systémoch Windows, MacOS a Linux sa prostredníctvom polo-oficiálneho projektu *Flutter Desktop Embedding*, spúšťa Flutter vo virtuálnom stroji Dartu, ktorý obsahuje spúšťací modul just-in-time. Pri písaní a ladení aplikácie používa Flutter „Just In Time“ (okamžitú) kompiláciu, ktorá umožňuje „hot reload“ (Rýchle obnovenie), pomocou ktorého je možné vložiť zmeny v zdrojových súboroch do bežiacej aplikácie. Flutter dokonca rozširuje túto funkciu o podporu okamžitého obnovenia stavu aplikácie (stateful hot reload), kde vo väčšine prípadov sa zmeny zdrojového kódu môžu okamžite prejaviť v bežiacej aplikácii bez toho, aby ju bolo potrebné reštartovať alebo by sa stratil jej aktuálny stav.

Vydané verzie Flutter aplikácií sú kompilované s ahead-of-time (AOT) kompiláciou v systémoch Android aj iOS, čo umožňuje vysoký výkon Flutteru na mobilných zariadeniach.

### Flutter modul
Flutter modul, je primárne napísaný v C++ a poskytuje podporu renderovania (vykresľovania) na low-level (nízkej úrovni) pomocou grafickej knižnice Skia od spoločnosti Google. Okrem toho sa pripája k SDK nástrojom špecifickým pre platformu, ako je Android a iOS. Flutter modul je prenosný runtime modul na hosťovanie Flutter aplikácií. Implementuje základné knižnice Flutteru vrátane animácie a grafiky, vstupno-výstupných súborov a sietí, podporu prístupnosti, architektúru doplnkov a Dart runtime s kompiláciu Dart nástrojov. Väčšina vývojárov bude interagovať s Flutterom len prostredníctvom Flutter frameworku, ktorý poskytuje moderné, reaktívne rozhranie a bohatú sadu základných widgetov ako aj widgetov pre platformu a základné rozloženie aplikácií.

### Základná knižnica
Základná knižnica, napísaná v jazyku Dart, poskytuje základné triedy a funkcie, ktoré sa používajú na vytváranie aplikácií pomocou Flutteru, ako sú API rozhrania na komunikáciu s Flutter modulom.

#### Widgety
Používateľský Dizajn vo Flutteri zahŕňa použitie kompozície na zostavenie / vytvorenie „Widgetov“ z iných Widgetov. Trik na pochopenie tohto je uvedomiť si, že každý strom komponentov (Widgetov), ktorý je zostavený pod jedinou metódou build(), sa tiež označuje ako samostatný Widget. Dôvodom je skutočnosť, že tieto menšie Widgety sa skladajú z ešte ďalších menších Widgetov a každý z nich má svoju vlastnú metódu build(). Takto Flutter využíva kompozíciu.

Podľa dokumentácie: „Widget je nemenný popis časti používateľského rozhrania.“ Zjednodušene je možné o tom rozmýšľať ako o nemennom modele. Nútné je však mať na pamäti, že vo Flutteri je veľa typov Widgetov a nie všetky je možné vidieť alebo ich upravovať. Napríklad Text je Widget, ale aj jeho TextStyle je Widget, ktorý definuje veci ako veľkosť, farba, font a hrúbku písma. Existujú Widgety, ktoré reprezentujú objekty (Text), iné ktoré predstavujú charakteristiky (TextStyle), a dokonca také, ktoré budujú ďalšie objekty, ako napríklad FutureBuilder a StreamBuilder.

Zložité Widgety je možné vytvoriť kombináciou mnohých jednoduchších Widgetov a aplikácia je vlastne následne iba najväčším Widgetom z nich (často nazývaný „MyApp“). Widget „MyApp“ obsahuje všetky ostatné Widgety, ktoré môžu obsahovať ešte menšie Widgety, a spolu tvoria celú aplikáciu.

Na zostavenie Flutter aplikácií sa však striktne nevyžaduje použitie Widgetov. Alternatívnou možnosťou, ktorú obvykle používajú iba ľudia, ktorí radi ovládajú každý pixel vykreslený na obrazovke, je priame použitie základných metód knižnice. Tieto metódy sa dajú použiť na vykreslenie rôznych tvarov, textu a snímok priamo na plátno obrazovky. Táto schopnosť Flutteru sa využíva v niektorých herných enginoch.

Flutter aj všeobecne funguje skôr ako herný engine. Používateľské rozhranie je zostavené a vykreslené na plátno (canvas Skia) podľa toho, ako sa mení pomocou metódy každého widgetu 'build()'. Flutter aktualizuje používateľské rozhranie rýchlosťou 60 snímok / s (60 fps) alebo 120 fps na zariadeniach, ktoré sú schopné sa aktualizovať frekvenciou 120 Hz.

### Dizajnovo špecifické Widgety
Flutter framework obsahuje dve sady Widgetov, ktoré zodpovedajú konkrétnemu dizajnu jazykov. Material Design Widgety implementujú dizajnový jazyk Google s rovnakým názvom (Material Design) a Cupertino Widgety implementujú pokyny spoločnosti Apple pre iOS Human rozhranie.

## Príklad
### Ahoj Svet
Program Ahoj Svet vo Flutteri vyzerá nasledovne:
```dart
import 'package:flutter/material.dart';
 
void main() => runApp(MyApp());
 
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Ahoj Svet',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Ahoj Svet'),
        ),
        body: Center(
      child: Text('Ahoj Svet'),
        ),
      ),
    ),      
  }
}
```


## Referencie

## Externé odkazy
*Oficiálna stránka
*Himdeve development: "Google Flutter | Kompletná príručka tutoriálov pre začiatočníkov"  v slovenčine
*Flutternest

Kategória:Programovací softvér
Kategória:Softvér firmy Google