# Grundlegendes zu Flutter

## 🔄 **Async/Await - Vollständige Erklärung**

## Das Problem: Warum ist Dateiarbeit langsam?

Stell dir vor, du machst eine Pizza:

<div class="w-full md:max-w-[90vw]" id="bkmrk-text-synchron-%28block"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">text</div></div><div>`SYNCHRON (blockierend - FALSCH für Dateien):┌─────────────────────────────────────────┐│ 1. Pizza in den Ofen (15 Min)           ││    ← Der Pizzabäcker WARTET hier!       ││    ← Kann nichts anderes machen!        ││                                         ││ 2. Pizza rausnehmen                     ││ 3. Nächste Pizza machen                 │└─────────────────────────────────────────┘Resultat: Sehr ineffizient!`</div></div></div></div><div class="w-full md:max-w-[90vw]" id="bkmrk-text-asynchron-%28nich"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">text</div></div><div>`ASYNCHRON (nicht-blockierend - RICHTIG für Dateien):┌─────────────────────────────────────────┐│ 1. Pizza in den Ofen (15 Min)           ││    ← Der Pizzabäcker WARTET NICHT!      ││                                         ││ 2. Macht währenddessen Pizza 2 (parallel)│ 3. Macht Pizza 3                        ││ 4. Bekommt Signal: "Pizza 1 ist fertig!"│ 5. Holt Pizza 1 raus                    │└─────────────────────────────────────────┘Resultat: Sehr effizient!`</div></div></div></div>---

## Code-Beispiel: Sync vs Async

## ❌ **SYNCHRON (Falsch für Dateien):**

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-void-main%28%29-%7B-p"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">dart</div></div><div>`<span class="token token">void</span> <span class="token token">main</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token punctuation">{</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Start'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>    <span class="token token">// Annahme: Datei braucht 2 Sekunden</span>  <span class="token token">final</span> file <span class="token token operator">=</span> <span class="token token">File</span><span class="token token punctuation">(</span><span class="token token string-literal">'data/users.json'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">final</span> content <span class="token token operator">=</span> file<span class="token token punctuation">.</span><span class="token token">readAsStringSync</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">// ← BLOCKIERT!</span>    <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Datei gelesen: </span><span class="token token string-literal interpolation punctuation">$</span><span class="token token string-literal interpolation expression">content</span><span class="token token string-literal">'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Fertig'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span><span class="token token">// Output:</span><span class="token token">// Start</span><span class="token token">// [warte 2 Sekunden... nichts läuft!]</span><span class="token token">// Datei gelesen: ...</span><span class="token token">// Fertig</span><span class="token token">// Die App war 2 Sekunden "eingefroren"!</span>`</div></div></div></div>**Problem:** Während die App wartet, kann sie NICHTS anderes machen!

---

## ✅ **ASYNCHRON (Richtig für Dateien):**

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-void-main%28%29-asy"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">dart</div></div><div>`<span class="token token">void</span> <span class="token token">main</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token">async</span> <span class="token token punctuation">{</span>  <span class="token token">// ← main() wird async!</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Start'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>    <span class="token token">final</span> file <span class="token token operator">=</span> <span class="token token">File</span><span class="token token punctuation">(</span><span class="token token string-literal">'data/users.json'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">final</span> content <span class="token token operator">=</span> <span class="token token">await</span> file<span class="token token punctuation">.</span><span class="token token">readAsString</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">// ← BLOCKIERT NICHT!</span>    <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Datei gelesen: </span><span class="token token string-literal interpolation punctuation">$</span><span class="token token string-literal interpolation expression">content</span><span class="token token string-literal">'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Fertig'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span><span class="token token">// Output:</span><span class="token token">// Start</span><span class="token token">// [warte 2 Sekunden... aber die App läuft weiter!]</span><span class="token token">// Datei gelesen: ...</span><span class="token token">// Fertig</span><span class="token token">// Die App war NICHT eingefroren!</span>`</div></div></div></div>**Vorteil:** Die App kann während des Wartens andere Dinge machen!

---

## 🎯 **Was bedeuten die Keywords?**

<div class="group relative" id="bkmrk-keyword-bedeutung-be"><div class="w-full overflow-x-auto md:max-w-[90vw] border-subtlest ring-subtlest divide-subtlest bg-transparent"><table class="border-subtler my-[1em] w-full table-auto border-separate border-spacing-0 border-l border-t"><thead class="bg-subtler"><tr><th class="border-subtler p-sm break-normal border-b border-r text-left align-top">Keyword</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top">Bedeutung</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top">Beispiel</th></tr></thead><tbody><tr><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">**`async`**</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">"Diese Methode ist langsam, kann warten"</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">`Future<String> getData() async { ... }`</td></tr><tr><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">**`await`**</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">"Warte hier, bis Ergebnis kommt"</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">`final data = await loadFile();`</td></tr><tr><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">**`Future<T>`**</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">"Ein Ergebnis vom Typ T kommt später"</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r">`Future<int> getAge() { ... }`</td></tr></tbody></table>

</div></div>---

## 📊 **Visualisierung: Der Fluss von Async/Await**

<div class="w-full md:max-w-[90vw]" id="bkmrk-text-%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">text</div></div><div>`┌──────────────────────────────────────────────────────────┐│ Code ausführen                                            │└──────────────────────────────────────────────────────────┘                           │                           ▼┌──────────────────────────────────────────────────────────┐│ await StorageService.loadUsers()                          ││ ↓ Dart sagt: "Das dauert, gib mir ein Future"            │└──────────────────────────────────────────────────────────┘                           │                    ┌──────┴──────┐                    │             │            ▼ (Hauptprogramm)      ▼ (Datei laden im Hintergrund)                            (könnte hier etwas      loadUsers() arbeitet         anderes machen)         in Ruhe...                             │             │                    │      [Datei ist geladen!]                    │             │                    └──────┬──────┘                           ▼┌──────────────────────────────────────────────────────────┐│ loadedUsers hat jetzt den Wert!                           ││ Programm fährt fort: print('Fertig')                      │└──────────────────────────────────────────────────────────┘`</div></div></div></div>---

## 🧪 **Praktisches Beispiel: Async testen**

Erstelle `bin/async_demo.dart`:

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-import-%27dart%3Aio"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">dart</div></div><div>`<span class="token token">import</span> <span class="token token string-literal">'dart:io'</span><span class="token token punctuation">;</span><span class="token token">// Beispiel 1: Synchrone Funktion (NICHT async)</span><span class="token token">void</span> <span class="token token">syncFunction</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token punctuation">{</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Sync Start'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">sleep</span><span class="token token punctuation">(</span><span class="token token">Duration</span><span class="token token punctuation">(</span>seconds<span class="token token punctuation">:</span> <span class="token token">2</span><span class="token token punctuation">)</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">// Blockiert die App!</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Sync Ende (nach 2 Sekunden)'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span><span class="token token">// Beispiel 2: Asynchrone Funktion (mit async/await)</span><span class="token token">Future</span><span class="token token generics punctuation"><</span><span class="token token generics">void</span><span class="token token generics punctuation">></span> <span class="token token">asyncFunction</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token">async</span> <span class="token token punctuation">{</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Async Start'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">await</span> <span class="token token">Future</span><span class="token token punctuation">.</span><span class="token token">delayed</span><span class="token token punctuation">(</span><span class="token token">Duration</span><span class="token token punctuation">(</span>seconds<span class="token token punctuation">:</span> <span class="token token">2</span><span class="token token punctuation">)</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">// Blockiert NICHT!</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Async Ende (nach 2 Sekunden)'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span><span class="token token">// Beispiel 3: Mehrere Async-Funktionen (parallel!)</span><span class="token token">Future</span><span class="token token generics punctuation"><</span><span class="token token generics">void</span><span class="token token generics punctuation">></span> <span class="token token">multipleAsync</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token">async</span> <span class="token token punctuation">{</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'\n=== Mehrere Async-Tasks parallel ==='</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>    <span class="token token">// Alle 3 starten gleichzeitig!</span>  <span class="token token">final</span> task1 <span class="token token operator">=</span> <span class="token token">doTask</span><span class="token token punctuation">(</span><span class="token token string-literal">'Task 1'</span><span class="token token punctuation">,</span> <span class="token token">1</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">final</span> task2 <span class="token token operator">=</span> <span class="token token">doTask</span><span class="token token punctuation">(</span><span class="token token string-literal">'Task 2'</span><span class="token token punctuation">,</span> <span class="token token">2</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">final</span> task3 <span class="token token operator">=</span> <span class="token token">doTask</span><span class="token token punctuation">(</span><span class="token token string-literal">'Task 3'</span><span class="token token punctuation">,</span> <span class="token token">3</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>    <span class="token token">// Warte auf alle</span>  <span class="token token">await</span> <span class="token token">Future</span><span class="token token punctuation">.</span><span class="token token">wait</span><span class="token token punctuation">(</span><span class="token token punctuation">[</span>task1<span class="token token punctuation">,</span> task2<span class="token token punctuation">,</span> task3<span class="token token punctuation">]</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>    <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'Alle Tasks fertig!'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span><span class="token token">Future</span><span class="token token generics punctuation"><</span><span class="token token generics">void</span><span class="token token generics punctuation">></span> <span class="token token">doTask</span><span class="token token punctuation">(</span><span class="token token">String</span> name<span class="token token punctuation">,</span> int seconds<span class="token token punctuation">)</span> <span class="token token">async</span> <span class="token token punctuation">{</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'</span><span class="token token string-literal interpolation punctuation">$</span><span class="token token string-literal interpolation expression">name</span><span class="token token string-literal"> startet...'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">await</span> <span class="token token">Future</span><span class="token token punctuation">.</span><span class="token token">delayed</span><span class="token token punctuation">(</span><span class="token token">Duration</span><span class="token token punctuation">(</span>seconds<span class="token token punctuation">:</span> seconds<span class="token token punctuation">)</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'</span><span class="token token string-literal interpolation punctuation">$</span><span class="token token string-literal interpolation expression">name</span><span class="token token string-literal"> fertig!'</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span><span class="token token">void</span> <span class="token token">main</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token">async</span> <span class="token token punctuation">{</span>  <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'=== SYNCHRON (blockierend) ==='</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">syncFunction</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">// Freezt die App!</span>    <span class="token token">print</span><span class="token token punctuation">(</span><span class="token token string-literal">'\n=== ASYNCHRON (nicht-blockierend) ==='</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">await</span> <span class="token token">asyncFunction</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">// App läuft weiter!</span>    <span class="token token">await</span> <span class="token token">multipleAsync</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span>`</div></div></div></div>**Starte das Programm:**

<div class="w-full md:max-w-[90vw]" id="bkmrk-bash-dart-bin%2Fasync_"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">bash</div></div><div>`dart bin/async_demo.dart`</div></div></div></div>**Erwartete Ausgabe:**

<div class="w-full md:max-w-[90vw]" id="bkmrk-text-%3D%3D%3D-synchron-%28b"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">text</div></div><div>`=== SYNCHRON (blockierend) ===Sync StartSync Ende (nach 2 Sekunden)=== ASYNCHRON (nicht-blockierend) ===Async StartAsync Ende (nach 2 Sekunden)=== Mehrere Async-Tasks parallel ===Task 1 startet...Task 2 startet...Task 3 startet...Task 3 fertig!Task 2 fertig!Task 1 fertig!Alle Tasks fertig!`</div></div></div></div>**Beobachtung:** Task 3 endet zuerst (nur 1 Sekunde), obwohl sie nicht zuerst startete! Das zeigt, dass sie **parallel** laufen! 🚀

---

## 🎓 **Die 3 Zustände eines Future**

Ein `Future` hat immer einen von 3 Zuständen:

<div class="w-full md:max-w-[90vw]" id="bkmrk-text-%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80-1"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">text</div></div><div>`┌─────────────────────────────────────┐│         Future Status               │├─────────────────────────────────────┤│                                     ││  1. PENDING (wartet noch)           ││     await loadUsers()               ││     ↓ (Datei wird gelesen...)       ││                                     ││  2. COMPLETED (fertig!)             ││     ↓ (Datei komplett gelesen)      ││     loadedUsers = [User(...), ...]  ││                                     ││  3. ERROR (Fehler!)                 ││     ↓ (Datei nicht gefunden)        ││     catch (e) { print(e); }         ││                                     │└─────────────────────────────────────┘`</div></div></div></div>---

## ⚠️ **Wichtige Regeln:**

**Regel 1:** Du kannst **nur `await` innerhalb von `async` Funktionen** nutzen!

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-%2F%2F-%E2%9C%85-richtig%3A-f"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">dart</div></div><div>`<span class="token token">// ✅ RICHTIG:</span><span class="token token">Future</span><span class="token token generics punctuation"><</span><span class="token token generics">void</span><span class="token token generics punctuation">></span> <span class="token token">myFunction</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token">async</span> <span class="token token punctuation">{</span>  <span class="token token">await</span> <span class="token token">Future</span><span class="token token punctuation">.</span><span class="token token">delayed</span><span class="token token punctuation">(</span><span class="token token">Duration</span><span class="token token punctuation">(</span>seconds<span class="token token punctuation">:</span> <span class="token token">1</span><span class="token token punctuation">)</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span><span class="token token">// ❌ FALSCH:</span><span class="token token">void</span> <span class="token token">myFunction</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token punctuation">{</span>  <span class="token token">await</span> <span class="token token">Future</span><span class="token token punctuation">.</span><span class="token token">delayed</span><span class="token token punctuation">(</span><span class="token token">Duration</span><span class="token token punctuation">(</span>seconds<span class="token token punctuation">:</span> <span class="token token">1</span><span class="token token punctuation">)</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">// ERROR!</span><span class="token token punctuation">}</span>`</div></div></div></div>**Regel 2:** Wenn du `await` brauchst, muss die Funktion `async` sein!

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-%2F%2F-%E2%9C%85-richtig%3A-v"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div><div class="-mt-xl"><div><div class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin" data-testid="code-language-indicator">dart</div></div><div>`<span class="token token">// ✅ RICHTIG:</span><span class="token token">void</span> <span class="token token">main</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token">async</span> <span class="token token punctuation">{</span>  <span class="token token">// ← main() wird async!</span>  <span class="token token">await</span> <span class="token token">StorageService</span><span class="token token punctuation">.</span><span class="token token">loadUsers</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span><span class="token token punctuation">}</span><span class="token token">// ❌ FALSCH:</span><span class="token token">void</span> <span class="token token">main</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span> <span class="token token punctuation">{</span>  <span class="token token">await</span> <span class="token token">StorageService</span><span class="token token punctuation">.</span><span class="token token">loadUsers</span><span class="token token punctuation">(</span><span class="token token punctuation">)</span><span class="token token punctuation">;</span>  <span class="token token">// ERROR!</span><span class="token token punctuation">}</span>`</div></div></div></div>**Regel 3:** `async` macht deine Funktion automatisch zu einem `Future`!

```dart
Future<String> getData() async { // ← Gibt automatisch Future<String> zurück! 
  return "Daten"; } // Ist gleichbedeutend mit: 

Future<String> getData2() { // ← Musst du manuell Future sagen 
  return Future.value("Daten"); }
```

<div class="w-full md:max-w-[90vw]" id="bkmrk--7"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtler">  
</div></div></div></div></div>---

## 🧠 **Kurze Analogie:**

```
Synchron: 
Du: "Barista, mach mir einen Kaffee" 
Barista: "Ja, warte hier... [5 Minuten warten]... Fertig!" 
Du: "Okay, danke!" ← Du konntest nur herumsitzen! 

Asynchron: 
Du: "Barista, mach mir einen Kaffee" (mit Future-Ticket) 
Barista: "Ja, kein Problem, ich ruf dich auf!" 
Du: "Gut, ich setz mich hin und lies Zeitung" ← Du machst etwas anderes! [5 Minuten später] 
Barista: "Dein Kaffee ist fertig!" (Future resolved!) 
Du: "Danke!" ← Du warst nicht blockiert!
```

<div id="bkmrk--9"></div>## Methoden und Klassen

Eine typische Funktion in Dart besteht aus dem Rückgabewert, dem Namen, optionalen Parametern und dem Funktionskörper.

## Aufbau einer Funktion

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-copy-code"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div><div class="codeblock relative font-sans text-[16px]"><div class="flex items-center justify-between py-1.5 px-4"><span class="text-xs lowercase text-white">dart</span><div class="flex items-center"><button class="flex gap-1.5 items-center rounded bg-none p-1 text-xs text-white"><svg class="tabler-icon tabler-icon-clipboard" fill="none" height="18" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2"></path><path d="M9 3m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path></svg>Copy code</button><button class="flex items-center rounded bg-none p-1 text-xs text-white"><svg class="tabler-icon tabler-icon-download" fill="none" height="18" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2"></path><path d="M7 11l5 5l5 -5"></path><path d="M12 4l0 12"></path></svg></button></div></div></div></div></div></div>```dart
Rueckgabewert funktionsName(Parameter) {
  // Funktionskörper
  return wert; // nur wenn Rueckgabewert nicht void ist
}
```

Beispiel:

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-copy-code-1"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div><div class="codeblock relative font-sans text-[16px]"><div class="flex items-center justify-between py-1.5 px-4"><span class="text-xs lowercase text-white">dart</span><div class="flex items-center"><button class="flex gap-1.5 items-center rounded bg-none p-1 text-xs text-white"><svg class="tabler-icon tabler-icon-clipboard" fill="none" height="18" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2"></path><path d="M9 3m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path></svg>Copy code</button><button class="flex items-center rounded bg-none p-1 text-xs text-white"><svg class="tabler-icon tabler-icon-download" fill="none" height="18" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2"></path><path d="M7 11l5 5l5 -5"></path><path d="M12 4l0 12"></path></svg></button></div></div></div></div></div></div>```dart
int addiere(int a, int b) {
  return a + b;
}
```

## Aufbau einer Klasse

Eine Klasse bündelt Werte (Felder), einen Konstruktor und Methoden.

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-copy-code-2"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div><div class="codeblock relative font-sans text-[16px]"><div class="flex items-center justify-between py-1.5 px-4"><span class="text-xs lowercase text-white">dart</span><div class="flex items-center"><button class="flex gap-1.5 items-center rounded bg-none p-1 text-xs text-white"><svg class="tabler-icon tabler-icon-clipboard" fill="none" height="18" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2"></path><path d="M9 3m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path></svg>Copy code</button><button class="flex items-center rounded bg-none p-1 text-xs text-white"><svg class="tabler-icon tabler-icon-download" fill="none" height="18" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2"></path><path d="M7 11l5 5l5 -5"></path><path d="M12 4l0 12"></path></svg></button></div></div></div></div></div></div>```dart
class Auto {
  // Felder
  final String marke;
  int kilometerstand;

  // Konstruktor
  Auto(this.marke, this.kilometerstand);

  // Methode
  void fahre(int kilometer) {
    kilometerstand += kilometer;
  }

  // Eine Methode mit Rückgabewert
  String beschreibung() {
    return 'Marke: $marke, Kilometerstand: $kilometerstand';
  }
}
```

## Nutzung der Klasse

<div class="w-full md:max-w-[90vw]" id="bkmrk-dart-copy-code-3"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-normal bg-subtler"><div><div class="codeblock relative font-sans text-[16px]"><div class="flex items-center justify-between py-1.5 px-4"><span class="text-xs lowercase text-white">dart</span><div class="flex items-center"><button class="flex gap-1.5 items-center rounded bg-none p-1 text-xs text-white"><svg class="tabler-icon tabler-icon-clipboard" fill="none" height="18" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2"></path><path d="M9 3m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path></svg>Copy code</button><button class="flex items-center rounded bg-none p-1 text-xs text-white"><svg class="tabler-icon tabler-icon-download" fill="none" height="18" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2"></path><path d="M7 11l5 5l5 -5"></path><path d="M12 4l0 12"></path></svg></button></div></div></div></div></div></div>```dart
void main() {
  final auto = Auto('Tesla', 0);   // Konstruktor
  auto.fahre(120);                 // Methode
  print(auto.beschreibung());      // Methode mit Rückgabewert
}
```

So siehst du den typischen Aufbau: Felder speichern den Zustand, der Konstruktor initialisiert ihn, und Methoden ändern oder lesen ihn aus.