Flutter

**Flutter** on Google loodud avatud lähtekoodiga kasutajaliidese tarkvaraarenduskomplekt.

Flutter on kirjutatud C, C++ ja Darti keeltes ning kasutab Darti programmeerimiskeelt.

## Ajalugu
Flutterit tutvustati nimega Sky 2015. aastal Dart Developer Summitil, kus avalikustati, et Flutter baseerub Darti programmeerimiskeelel ning oli mõeldud ainult Androidi operatsioonisüsteemile. Lisaks väideti, et Flutter suudab renderdada püsivalt kaadrisagedusega 120. Esimene versioon, Flutter 1.0 tuli välja 4. detsembril 2018. aastal ning see versioon sisaldas juba ka tuge iOS-ile.

11. detsembril 2019 tulid välja Dart 2.7 ja Flutter 1.12, mis lisasid macOS-i ja veebi beetatoed ning olemasolevate rakenduste Flutterile üleviimise võimaluse.

8. mail 2020 uuendati Dart 2.8-le ja Flutter 1.17-le, mis lisas toese Metal API-le parandades iOS-i jõudlust märgatavalt.

8. juulil 2020 ilmus Google'i ja Canonicali koostöös Flutteri tugi Linuxile.

5. oktoobril 2020 uuendati Flutter 1.22-le, mis lisas iOS 14 ja Android 11 toed.

3. märtsil 2021 tuli Google välja suurima uuendusega – saabus Flutter 2.0. Nüüd sai Flutteri laiendust kasutada ka populaarsemates integreeritud programmeerimiskeskkondades nagu IntelliJ, Android Studio ja Visual Studio Code.

8. septembril 2021 uuendati Flutter 2.5 peale. Uuendus parandas Androidi täisekraani režiimis kasutamist ning keskendus enamjaolt jõudluse parandamisele.

12. mail 2022 tuli välja teine suurem uuendus, millega saabus Flutter 3. See uuendus kasvatas toetavate platvormide arvu kuuele, lisades stabiilse toe Linuxile ja MacOS-ile nii Inteli kui ka Apple Siliconi protsessoritel.

30. augustil 2022 uuendati Flutter 3.3 peale. Uuendusega kaasnes uus graafikamootor Impeller, mis võimendas Flutter renderdamist märgatavalt.

## Arhitektuur
Flutter on laiendatav kihtidega süsteem, kus iga eraldi olev teek sõltub eelnevast kihist ning iga raamistiku tase on valikuline ja välja vahetatav.

Flutteri arhitektuuri suured osad on järgmised:

* Flutteri mootor
* Flutteri teek
* Darti platvorm
* *Widgets*
* Flutteri arendusinstrumendid

### Flutteri mootor
Flutteri tuumas asub tema mootor, mis sisaldab kõiki vajalikke primitiive Flutteri rakenduste toetamiseks.

See on enamjaolt kirjutatud C++ keeles ning pakub madalatasemelist Flutteri tuuma API rakendamist, mille hulgas on ka graafika, tekstipaigutus, faili ning võrgu sisend-väljund ja palju muud.

### Flutteri teek
Flutteri teek on kirjutatud Darti keeles ning olemas on põhilised klassid ja funktsioonid, mida kasutatakse rakendustes mootoriga suhtlemiseks.

### Dart
Dart on programmeerimiskeel, mis loodi 2011. aastal Google'i poolt. Dart sarnaneb oma süntaksilt C# ja Javaga, mistõttu on seda arendajatel lihtne õppida ning  kasutusele võtta. Flutteri valis Darti oma programmeerimiskeeleks, kuna taheti kasutada keelt, mis oleks sarnane juba populaarsete keeltega nagu JavaScript, Java ja C# ning Dart oli selleks parim variant. Dart kasutab lisaks *[[just-in-time]]* kompileerimisele ka *[[ahead-of-time]]* kompileerimist, mis muudab Flutteri kiireks ja täielikult kohandatavaks.

Darti keele koodijupp, mis väljastab sõne "hello" 5 korda, näeb välja järgmine:
```dart
void main() {  
  for (int i = 0; i < 5; i++) {  
    print('hello ${i + 1}');  
  }  
}
```


### Widget
Kõige tähtsamat komponenti Flutteri rakenduses kutsutakse *[[Widget|widgetiks]]*. *Widgetid* on loodud kasutades raamistiku, mis sai oma inspiratsiooni Reactilt. 

Üks *widget* võib koosneda mitmest teisest *widgetist*, mis kõik kokku moodustavad hierarhilise struktuuri. Iga kasutajaliidese element Flutteris on *widget* ning ta saab olla kas staatiline (ingl *stateless*) või dünaamiline (ingl *stateful*). Staatilised *widgetid* uuenevad ainult siis, kui nende sisend muutub, dünaamilised *widgetid* jälgivad muutuseid ning uuendavad ennast vastavalt. Staatilised *widgetid* on näiteks tekst ja ikoon. Dünaamilised *widgetid* on näiteks slaider ja vorm.

Näide *widgetitest* Flutteris:
```dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('My Home Page'),
        ),
        body: Center(
          child: Builder(
            builder: (context) {
              return Column(
                children: [
                  const Text('Hello World'),
                  const SizedBox(height: 20),
                  ElevatedButton(
                    onPressed: () {
                      print('Click!');
                    },
                    child: const Text('A button'),
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}
```
Koodijupis iga implementeeritav klass on *widget*.

## Hello World näide
Hello worldi koodijupp Flutteris näeb välja järgmine:
```dart
import 'package:flutter/material.dart';

void main() => runApp(HelloWorldApp());

class HelloWorldApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Hello World App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Hello World App'),
        ),
        body: Center(
          child: Text('Hello World'),
        ),
      ),
    );
  }
}
```


## IDE tugi
Flutterit ja tema pistikprogramme (*plugin*) ametlikult toetavad IDE-d on:

* Visual Studio Code
* Android Studio
* IntelliJ IDEA
* Emacs

## Viited