# Implementierung

Im folgenden Kapitel wird die Implementierung des Projektes
beschrieben. Dabei wird auf die Entwicklungsumgebung, die
Verwendung von Flutter und Dart, die Einrichtung des Raspberry
Pi und die Implementierung der Software eingegangen.

## Entwicklungsumgebung

### Visual Studio Code

Für die Implementierung der Fallstudie wurde die
plattformübergreifende Open-Source-Entwicklungsumgebung
Visual Studio Code (VS Code) von Microsoft verwendet.
VS Code ist eine sehr beliebte Entwicklungsumgebung
für die Entwicklung von Webanwendungen, mobilen
Anwendungen und Desktopanwendungen. Die Entwicklungsumgebung
bietet eine Vielzahl von Erweiterungen, die die
Entwicklung von Anwendungen in verschiedenen
Programmiersprachen und Frameworks unterstützen.

### Flutter Versionsverwaltung

Das Versionsmanagement von Flutter ist standardmäßig
sehr einfach gehalten. Es gibt nur eine globale
Installation von Flutter, die manuell auf dem System
installiert wird. Diese globale Installation
arbeitet mit Git und nutzt verschiedene Branches
für die verschiedenen Versionen von Flutter,
diese Branches nennt Google Channels. Die
Channels sind **stable**, **beta** und **master**.
Die **stable** Version ist immer die aktuellste
stabile Version von Flutter, diese wird für die
Produktion und für die meisten Entwickler empfohlen.
Die **beta** Version ist die neueste stabile Version
von Flutter, welche neue Features beinhalten kann und
nicht für die Produktion empfohlen wird. Diese Version
wird später zur nächsten **stable** Version höhergestuft
und wird von Google jedoch auch bereits extensiv getestet
und sollte sehr stabil sein. Die **master** Version ist die neueste
Entwicklungsversion von Flutter, diese Version ist
nicht stabil und wird nicht für die Produktion
empfohlen. Diese Version beinhaltet alle neuesten
Commits welche von Entwicklern in das Flutter
Repository gepusht wurden.

Hierbei gibt es jedoch einige Probleme, die
durch die globale Installation von Flutter
entstehen. Die globale Installation von Flutter
ist nicht für die Arbeit mit verschiedenen
Projekten und verschiedenen Versionen von Flutter
ausgelegt. Es gibt keine Möglichkeit, verschiedene
Versionen von Flutter zu installieren und zu
verwalten. Außerdem gibt es keine einfache Möglichkeit,
eine bestimmte Version von Flutter zu installieren,
es wird immer die neueste **stable**, **beta** oder
**master** Version installiert. So wurde in der
Entwicklung der Fallstudie Flutter Version 3.19.2
verwendet, welche jedoch zu einem späteren Zeitpunkt
nicht mehr aktuell ist.

Zur Lösung dieser Probleme gibt es verschiedene
Versionsverwaltungs-Tools für Flutter. Die bekanntesten
sind FVM (Flutter Version Management) und Puro.

FVM ist ein simples CLI-Tool, welches es ermöglicht,
verschiedene Versionen von Flutter zu installieren
und zu verwalten. Puro dahingegen ist ein weiteres
CLI-Tool, welches neben der Versionsverwaltung von
Flutter auch eine Integration mit den bekannten
Entwicklungsumgebungen VS Code und IntelliJ bietet.

In der Fallstudie wurde Puro verwendet und das
Projekt ist so konfiguriert, dass es die Version
3.19.2 von Flutter verwendet.

<!-- MacOS und Linux

```bash
curl -o- https://puro.dev/install.sh | PURO_VERSION="1.4.4" bash
```

Windows

```powershell
Invoke-WebRequest -Uri "https://puro.dev/builds/1.4.4/windows-x64/puro.exe" -OutFile "$env:temp\puro.exe"; &"$env:temp\puro.exe" install-puro --promote
```

Puro Optimierungen:

- parallel git clone and engine download
- global cache for git history
- global cache for engine versions

With other approaches, each Flutter repository is in its own folder, requiring you to download and store the git history, engine, and framework of each version:

Puro implements a technology similar to GitLab's object deduplication to avoid downloading the same git objects over and over again. It also uses symlinks to share the same engine version between multiple installations:

```bash
puro use -g stable
```

```bash
puro create bachelor_elinux 3.19.0
```

```bash
puro use bachelor_elinux
```

`.puro.json`:

```json
{
  "env": "bachelor_elinux"
}
```

`.vscode/settings.json`

```json
{
  "dart.flutterSdkPath": "/Users/fabian/.puro/envs/bachelor_elinux/flutter",
  "dart.sdkPath": "/Users/fabian/.puro/envs/bachelor_elinux/flutter/bin/cache/dart-sdk"
}
```

```bash
puro flutter --version
```

```bash
Flutter 3.19.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision bae5e49bc2 (6 days ago) • 2024-02-13 17:46:18 -0800
Engine • revision 04817c99c9
Tools • Dart 3.3.0 • DevTools 2.31.1
```

## Setup von Raspberry Pi -->
