<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Allround-Blog</title>
	<atom:link href="https://allround-blog.de/feed/" rel="self" type="application/rss+xml" />
	<link>https://allround-blog.de</link>
	<description>ein buntes Themenspektrum</description>
	<lastBuildDate>Thu, 26 Mar 2026 20:51:48 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8</generator>

<image>
	<url>https://allround-blog.de/wp-content/uploads/2024/10/cropped-sprechblasen-favicon-32x32.webp</url>
	<title>Allround-Blog</title>
	<link>https://allround-blog.de</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">244281421</site>	<item>
		<title>Haferflocken und Gesundheit: Vorteile, Nährstoffe &#038; Tipps</title>
		<link>https://allround-blog.de/gesundheit/haferflocken-und-gesundheit-3/</link>
					<comments>https://allround-blog.de/gesundheit/haferflocken-und-gesundheit-3/#respond</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Thu, 26 Mar 2026 19:09:00 +0000</pubDate>
				<category><![CDATA[Gesundheit]]></category>
		<category><![CDATA[Wohlbefinden]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=334</guid>

					<description><![CDATA[Haferflocken gehören zu den nährstoffreichsten Lebensmitteln, die du in deine Ernährung einbauen kannst. Sie liefern komplexe Kohlenhydrate, pflanzliches Protein, gesunde Fette und eine beeindruckende Menge an Vitaminen und Mineralstoffen. Haferflocken verbessern nachweislich die Verdauung, stabilisieren den Blutzuckerspiegel und können den Cholesterinspiegel senken. Vielleicht isst du bereits Haferflocken zum Frühstück, oder du überlegst, sie häufiger in [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Haferflocken gehören zu den nährstoffreichsten Lebensmitteln, die du in deine Ernährung einbauen kannst. Sie liefern komplexe Kohlenhydrate, pflanzliches Protein, gesunde Fette und eine beeindruckende Menge an Vitaminen und Mineralstoffen. <strong><a href="https://www.verbraucherzentrale.nrw/wissen/lebensmittel/auswaehlen-zubereiten-aufbewahren/haferflocken-regelmaessig-essen-sind-haferflocken-gesund-117957">Haferflocken verbessern nachweislich die Verdauung</a>, stabilisieren den Blutzuckerspiegel und können den Cholesterinspiegel senken.</strong></p>



<p class="wp-block-paragraph">Vielleicht isst du bereits Haferflocken zum Frühstück, oder du überlegst, sie häufiger in deinen Speiseplan aufzunehmen. Die gesundheitlichen Vorteile reichen von besserer Herzgesundheit bis zu langanhaltender Sättigung beim Abnehmen. Dabei spielt der Ballaststoff Beta-Glucan eine besonders wichtige Rolle.</p>



<p class="wp-block-paragraph">In diesem Artikel erfährst du, welche Nährstoffe in Haferflocken stecken, wie sie deine Gesundheit unterstützen und wie du sie am besten zubereitest. Du bekommst auch Antworten auf häufige Fragen zur Verträglichkeit und zur optimalen Menge für deinen täglichen Bedarf.</p>



<h2 class="wp-block-heading">Haferflocken: Was sie ausmacht und Sorten</h2>



<p class="wp-block-paragraph">Haferflocken entstehen durch einen speziellen Verarbeitungsprozess von Hafer und unterscheiden sich hauptsächlich in ihrer Textur und Zubereitungszeit. Die Wahl zwischen verschiedenen Sorten und Haferprodukten hängt von deinen persönlichen Vorlieben und der geplanten Verwendung ab.</p>



<h3 class="wp-block-heading">Herstellung von Haferflocken</h3>



<p class="wp-block-paragraph">Die <a href="https://www.porridgerezept.de/haferflocken-ein-umfassender-guide-zu-sorten-herstellung-und-kaufkriterien/">Herstellung von Haferflocken</a> beginnt mit der gründlichen Reinigung des Rohhafers. Danach werden die Körner geschält, um die ungenießbaren Hüllspelzen zu entfernen.</p>



<p class="wp-block-paragraph">Der nächste Schritt ist das Dämpfen, das die Haferkörner weich und leichter verdaulich macht. Anschließend werden die gedämpften Körner gewalzt, wobei die Intensität des Walzens die spätere Textur bestimmt.</p>



<p class="wp-block-paragraph"><strong>Die wichtigsten Produktionsschritte:</strong></p>



<ul class="wp-block-list">
<li>Reinigung und Schälen des Hafers</li>



<li>Dämpfen der Körner</li>



<li>Walzen zu Flocken</li>



<li>Trocknung</li>
</ul>



<p class="wp-block-paragraph">Je nach Walzintensität entstehen unterschiedlich dicke Flocken. Dickere Flocken behalten mehr Biss, während dünner gewalzte Flocken eine zartere Konsistenz haben.</p>



<h3 class="wp-block-heading">Unterschiede: Kernige vs. Zarte Haferflocken</h3>



<p class="wp-block-paragraph">Kernige Haferflocken bestehen aus ganzen Haferkörnern, die einmal gewalzt wurden. Sie haben eine bissfeste Textur und benötigen eine längere Kochzeit von etwa 5-7 Minuten.</p>



<p class="wp-block-paragraph">Zarte Haferflocken entstehen, wenn die Haferkörner vor dem Walzen klein geschnitten werden. Dadurch <a href="https://www.ratundwissen.de/was-sind-die-unterschiede-bei-haferflocken/">sind sie deutlich dünner und weicher</a> und quellen schneller auf. Ihre Garzeit beträgt nur 1-3 Minuten.</p>



<p class="wp-block-paragraph"><strong>Vergleich der beiden Sorten:</strong></p>



<figure class="wp-block-table"><table><thead><tr><th>Eigenschaft</th><th>Kernige Haferflocken</th><th>Zarte Haferflocken</th></tr></thead><tbody><tr><td>Textur</td><td>Bissfest, kernig</td><td>Weich, cremig</td></tr><tr><td>Kochzeit</td><td>5-7 Minuten</td><td>1-3 Minuten</td></tr><tr><td>Verwendung</td><td>Müsli, Overnight Oats</td><td>Porridge, Backen</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Die <a href="https://www.fitforfun.de/gesunde-ernaehrung/welche-haferflocken-sind-die-richtigen-fuer-dich-kernig-oder-zart-767529.html">Nährstoffzusammensetzung beider Sorten</a> ist nahezu identisch. Der Unterschied liegt hauptsächlich in der Konsistenz und Zubereitungszeit.</p>



<h3 class="wp-block-heading">Haferflocken und andere Haferprodukte</h3>



<p class="wp-block-paragraph">Neben klassischen Haferflocken gibt es weitere Haferprodukte mit unterschiedlichen Eigenschaften. <strong>Instant-Haferflocken</strong> sind bereits vorgedämpft und besonders fein gewalzt, sodass sie keine Kochzeit benötigen.</p>



<p class="wp-block-paragraph"><strong>Hafergrütze</strong> besteht aus grob geschnittenen Haferkörnern. Sie hat eine körnige Textur und einen intensiv nussigen Geschmack. Die Zubereitung dauert etwa 20-30 Minuten.</p>



<p class="wp-block-paragraph"><strong>Haferkleie</strong> ist die äußere Schale des Haferkorns und <a href="https://de.wikipedia.org/wiki/Haferflocken">enthält besonders viele Ballaststoffe</a>. Haferschleim entsteht durch das Kochen und Abseihen von Haferflocken und wird traditionell als Babynahrung verwendet.</p>



<p class="wp-block-paragraph"><em>Haferflocken</em> bleiben die vielseitigste Form für deine tägliche Ernährung. Sie lassen sich problemlos in Smoothies mischen, zu Porridge kochen oder als Zutat in Backwaren verwenden.</p>



<h2 class="wp-block-heading">Nährstoffe und Inhaltsstoffe von Haferflocken</h2>



<p class="wp-block-paragraph">Haferflocken liefern eine beeindruckende Kombination aus Makro- und Mikronährstoffen. Die Nährwerte umfassen hochwertige Ballaststoffe wie Beta-Glucan, essenzielle Vitamine, wichtige Mineralstoffe und pflanzliche Proteine, die zusammen zur gesundheitsfördernden Wirkung beitragen.</p>



<h3 class="wp-block-heading">Ballaststoffe und Beta-Glucan</h3>



<p class="wp-block-paragraph">Haferflocken sind eine hervorragende Quelle für Ballaststoffe, wobei etwa 100 Gramm rund 10 Gramm Ballaststoffe enthalten. Besonders wertvoll sind die Beta-Glucane, eine spezielle Form löslicher Ballaststoffe, die einzigartige gesundheitliche Vorteile bieten.</p>



<p class="wp-block-paragraph">Diese Beta-Glucan-Ballaststoffe nehmen im Verdauungstrakt Wasser auf und bilden eine gelartige Substanz. <a href="https://www.zentrum-der-gesundheit.de/ernaehrung/lebensmittel/getreide-uebersicht/haferflocken">Mindestens 3 Gramm Beta-Glucane täglich</a>, was etwa 70 Gramm Haferflocken entspricht, können den Cholesterinspiegel regulieren.</p>



<p class="wp-block-paragraph">Die Beta-Glucane wirken zudem präbiotisch und fördern das Wachstum gesunder Darmbakterien. Sie helfen bei der Regulierung der Darmbewegungen und können Verstopfung vorbeugen, indem sie zu weichem und voluminösem Stuhl beitragen.</p>



<h3 class="wp-block-heading">Vitamine und Mineralstoffe</h3>



<p class="wp-block-paragraph">Haferflocken enthalten ein breites Spektrum an <a href="https://www.verbraucherzentrale.nrw/wissen/lebensmittel/auswaehlen-zubereiten-aufbewahren/haferflocken-regelmaessig-essen-sind-haferflocken-gesund-117957">wichtigen Vitaminen und Mineralstoffen</a>, die für verschiedene Körperfunktionen essenziell sind. Besonders hervorzuheben sind die B-Vitamine, allen voran Vitamin B1 (Thiamin) und Vitamin B6, die für den Energiestoffwechsel und die Nervenfunktion wichtig sind.</p>



<p class="wp-block-paragraph">Bei den Mineralstoffen sticht Mangan besonders hervor – Haferflocken zählen zu den besten Quellen für dieses Spurenelement. Mangan wird zur Herstellung antioxidativer Enzyme benötigt und ist wichtig für Gehirn, Nerven und Knochengesundheit.</p>



<p class="wp-block-paragraph">Weitere bedeutende Mineralstoffe sind:</p>



<ul class="wp-block-list">
<li><strong>Eisen</strong> für die Blutbildung und den Sauerstofftransport</li>



<li><strong>Magnesium</strong> für Muskel- und Nervenfunktion</li>



<li><strong>Zink</strong> für das Immunsystem</li>



<li><strong>Kupfer</strong> für verschiedene Stoffwechselprozesse</li>
</ul>



<p class="wp-block-paragraph">Die Phytinsäure in Haferflocken kann zwar die Aufnahme einiger Mineralstoffe leicht reduzieren, doch überwiegen die gesundheitlichen Vorteile deutlich.</p>



<h3 class="wp-block-heading">Eiweiß und Kaloriengehalt</h3>



<p class="wp-block-paragraph">Mit etwa 13-14 Gramm Protein pro 100 Gramm liefern <a href="https://www.vitamine.com/lebensmittel/haferflocken/">Haferflocken hochwertiges pflanzliches Eiweiß</a>. Dieses Protein enthält alle essenziellen Aminosäuren, wenn auch nicht in optimalen Verhältnissen.</p>



<p class="wp-block-paragraph">Der Kaloriengehalt liegt bei ungefähr 350-370 Kilokalorien pro 100 Gramm. Das klingt zunächst hoch, doch die Flocken sind sehr sättigend, sodass bereits kleinere Portionen von 40-50 Gramm für eine Mahlzeit ausreichen.</p>



<p class="wp-block-paragraph">Die Kombination aus Eiweiß, Ballaststoffen und komplexen Kohlenhydraten sorgt für eine langanhaltende Sättigung. Dies macht Haferflocken ideal für die Gewichtskontrolle, da man insgesamt weniger isst und der Blutzuckerspiegel stabil bleibt.</p>



<h3 class="wp-block-heading">Antioxidantien und sekundäre Pflanzenstoffe</h3>



<p class="wp-block-paragraph">Haferflocken enthalten zahlreiche <a href="https://www.zentrum-der-gesundheit.de/ernaehrung/lebensmittel/getreide-uebersicht/haferflocken">antioxidativ wirksame Pflanzenstoffe</a>, die den Körper vor oxidativem Stress schützen. Dazu gehören Quercetin, Rutin und verschiedene Flavonole.</p>



<p class="wp-block-paragraph">Die Avenanthramide sind einzigartige Antioxidantien, die ausschließlich im Hafer vorkommen. Sie können dazu beitragen, den Blutdruck zu senken, indem sie die Produktion von Stickstoffmonoxid erhöhen, was die Blutgefäße erweitert und den Blutfluss verbessert.</p>



<p class="wp-block-paragraph">Weitere sekundäre Pflanzenstoffe sind Saponine, die in Studien krebshemmende Eigenschaften zeigten. Diese vielfältigen Antioxidantien wirken entzündungshemmend und können die Darmflora positiv beeinflussen, besonders bei fettreicher Ernährung.</p>



<h2 class="wp-block-heading">Haferflocken und ihre gesundheitlichen Vorteile</h2>



<p class="wp-block-paragraph">Haferflocken unterstützen deinen Körper auf vielfältige Weise: Sie fördern eine gesunde Verdauung, stabilisieren den Blutzuckerspiegel und können dir beim Abnehmen helfen. Gleichzeitig wirken sie sich positiv auf Cholesterinwerte und Herzgesundheit aus.</p>



<h3 class="wp-block-heading">Auswirkungen auf Verdauung und Darmgesundheit</h3>



<p class="wp-block-paragraph">Die Ballaststoffe in Haferflocken bringen deine Verdauung richtig in Schwung. Sie quellen im Darm auf und erhöhen das Stuhlvolumen, wodurch <a href="https://www.verbraucherzentrale.nrw/wissen/lebensmittel/auswaehlen-zubereiten-aufbewahren/haferflocken-regelmaessig-essen-sind-haferflocken-gesund-117957">Verstopfung vorgebeugt wird</a>.</p>



<p class="wp-block-paragraph">Die Behauptung, dass Haferflocken der Darmflora schaden, ist wissenschaftlich nicht belegt. Tatsächlich passiert genau das Gegenteil: Die Ballaststoffe wirken als Präbiotika und nähren deine gesunden Darmbakterien. Das stärkt deine Darmgesundheit nachhaltig.</p>



<p class="wp-block-paragraph">Wichtig ist aber, dass du mindestens 1,5 bis 2 Liter Wasser täglich trinkst. Ballaststoffe brauchen Flüssigkeit, um richtig zu wirken. Bei zu geringer Trinkmenge kann es paradoxerweise zu Verstopfung kommen, obwohl die Ballaststoffe eigentlich dagegen helfen sollen.</p>



<h3 class="wp-block-heading">Beitrag zur Regulierung des Blutzuckers</h3>



<p class="wp-block-paragraph">Haferflocken enthalten komplexe Kohlenhydrate, die dein Körper langsam verdaut. Dadurch steigt dein Blutzuckerspiegel gleichmäßig an, ohne starke Schwankungen. Das ist besonders wertvoll, wenn du <a href="https://www.aok.de/pk/magazin/ernaehrung/lebensmittel/darum-sind-haferflocken-gesund-sogar-bei-diabetes/">Diabetes Typ 2 oder Prädiabetes</a> hast.</p>



<p class="wp-block-paragraph">Der lösliche Ballaststoff Beta-Glucan spielt dabei eine zentrale Rolle. Er verlangsamt die Aufnahme von Glucose ins Blut und verhindert so die gefürchteten Blutzuckerspitzen nach dem Essen. Diese stabilisierende Wirkung macht Haferflocken zu einem idealen Frühstück für alle, die ihren Blutzuckerspiegel im Griff behalten möchten.</p>



<h3 class="wp-block-heading">Unterstützung beim Abnehmen</h3>



<p class="wp-block-paragraph">Obwohl Haferflocken mit etwa 350 Kilokalorien pro 100 Gramm durchaus gehaltvoll sind, können sie dir beim Abnehmen helfen. Die Kombination aus Ballaststoffen, Proteinen und komplexen Kohlenhydraten sorgt für lang anhaltende Sättigung.</p>



<p class="wp-block-paragraph">Beta-Glucan quillt in deinem Magen auf und verzögert die Magenentleerung. Das hält dich länger satt und verhindert Heißhungerattacken. Du isst automatisch weniger und kannst deine Kalorienzufuhr besser kontrollieren, ohne ständig gegen Hungergefühle anzukämpfen.</p>



<p class="wp-block-paragraph">Die hohe Nährstoffdichte macht Haferflocken trotz ihres Kaloriengehalts zu einer guten Wahl bei Übergewicht. Du versorgst deinen Körper mit wichtigen Nährstoffen und fühlst dich gleichzeitig länger zufrieden.</p>



<h3 class="wp-block-heading">Cholesterinspiegel und Herzgesundheit</h3>



<p class="wp-block-paragraph"><a href="https://www.br.de/nachrichten/wissen/hafer-im-check-so-gesund-sind-haferflocken-und-co-wirklich,UyHrsDX">Hafer-Ballaststoffe können deinen LDL-Cholesterinspiegel senken</a> und damit dein Risiko für Herzinfarkte und Schlaganfälle vermindern. Beta-Glucan bindet Gallensäuren im Darm, sodass dein Körper mehr Cholesterin für die Produktion neuer Gallensäuren verwenden muss.</p>



<p class="wp-block-paragraph">Ab etwa drei Gramm Beta-Glucan täglich kannst du messbare Effekte erwarten. Diese Menge steckt in circa 70 Gramm Haferflocken – das sind etwa sieben Esslöffel. Alternativ reichen schon 40 Gramm Haferkleie, da sie mehr Beta-Glucan enthält.</p>



<p class="wp-block-paragraph">Zusätzlich enthalten Haferflocken Antioxidantien wie Avenanthramide, die Entzündungen hemmen. Magnesium und Kalium unterstützen deine Herzfunktion und regulieren den Blutdruck auf natürliche Weise.</p>



<h2 class="wp-block-heading">Haferflocken in der täglichen Ernährung</h2>



<p class="wp-block-paragraph">Eine typische Portion liegt bei etwa 50 bis 70 Gramm Haferflocken, was ungefähr 5 bis 7 Esslöffeln entspricht. Diese Menge kannst du flexibel in verschiedene Mahlzeiten einbauen, sei es als klassisches Porridge am Morgen oder als Overnight Oats, die du bereits am Vorabend vorbereitest.</p>



<h3 class="wp-block-heading">Portionsempfehlungen &amp; Alltagstipps</h3>



<p class="wp-block-paragraph">Für dein <a href="https://www.verbraucherzentrale.nrw/wissen/lebensmittel/auswaehlen-zubereiten-aufbewahren/haferflocken-regelmaessig-essen-sind-haferflocken-gesund-117957">Frühstück mit Haferflocken</a> reichen 50 Gramm vollkommen aus. Wenn du deinen Cholesterinspiegel senken möchtest, solltest du etwa 70 Gramm täglich essen, um die empfohlenen drei Gramm Beta-Glucan zu erreichen.</p>



<p class="wp-block-paragraph">Du musst nicht jeden Tag nur Haferflocken essen. Eine abwechslungsreiche Ernährung mit verschiedenen Vollkornprodukten wie Dinkel-, Gersten- oder Roggenflocken ist wichtig. Gepuffter Quinoa oder Amaranth bieten ebenfalls wertvolle Nährstoffe.</p>



<p class="wp-block-paragraph"><strong>Praktische Tipps für deinen Alltag:</strong></p>



<ul class="wp-block-list">
<li>Bewahre Haferflocken in einem luftdichten Behälter auf</li>



<li>Steigere die Menge langsam, wenn du bisher wenig Ballaststoffe gegessen hast</li>



<li>Trinke mindestens 1,5 bis 2 Liter Wasser täglich</li>



<li>Kombiniere Haferflocken mit Nüssen, Samen und frischem Obst</li>
</ul>



<h3 class="wp-block-heading">Einfache Zubereitungen: Porridge, Overnight Oats &amp; Müsli</h3>



<p class="wp-block-paragraph"><strong>Porridge</strong> bereitest du zu, indem du 50 Gramm Haferflocken mit 200 Milliliter Flüssigkeit aufkochst. Du kannst Milch, Wasser oder einen Pflanzendrink verwenden. Nach wenigen Minuten Köcheln entsteht ein cremiger Haferbrei, den du warm genießt.</p>



<p class="wp-block-paragraph"><strong>Overnight Oats</strong> sind die perfekte Lösung für hektische Morgen. Vermische abends Haferflocken mit Naturjoghurt, Milch oder einem Pflanzendrink im Verhältnis 1:2. Füge einen Spritzer Zitronensaft hinzu, um die Phytinsäure abzubauen und die Nährstoffaufnahme zu verbessern. Lass die Mischung über Nacht im Kühlschrank quellen.</p>



<p class="wp-block-paragraph">Für ein <strong>klassisches Müsli</strong> kombinierst du rohe Haferflocken mit Naturjoghurt oder Milch. Toppe deine Schüssel mit frischen Beeren, gehackten Nüssen und einem Teelöffel Nussmus. Diese Variante ist schnell zubereitet und liefert dir wichtige Nährstoffe.</p>



<h3 class="wp-block-heading">Haferflocken im Frühstück und weiteren Mahlzeiten</h3>



<p class="wp-block-paragraph">Dein <a href="https://www.zentrum-der-gesundheit.de/ernaehrung/lebensmittel/getreide-uebersicht/haferflocken">Oatmeal-Frühstück</a> kannst du mit Zimt, Kardamom oder Vanille verfeinern. Vermeide gezuckerte Fertigmischungen und süße lieber mit frischem Obst oder einem Teelöffel Honig.</p>



<p class="wp-block-paragraph">Haferflocken funktionieren aber nicht nur süß. Du kannst sie herzhaft mit Gemüsebrühe kochen und mit Avocado, Ei oder gedünstetem Gemüse kombinieren. Als Käse-Hafer-Frikadellen oder in Bratlingen bieten sie eine nahrhafte Alternative zu herkömmlichen Beilagen.</p>



<p class="wp-block-paragraph">Zum Mittagessen passen Haferflocken in Suppen oder als Bindemittel für Hackfleischgerichte. Du kannst sie auch über Salate streuen, um zusätzliche Ballaststoffe und Proteine zu erhalten. Die Vielseitigkeit macht Haferflocken zu einem praktischen Begleiter für verschiedene Tageszeiten.</p>



<h2 class="wp-block-heading">Spezielle Ernährungsaspekte und Verträglichkeit</h2>



<p class="wp-block-paragraph">Haferflocken sind für die meisten Menschen gut verträglich, doch bei bestimmten Unverträglichkeiten und der Nährstoffaufnahme gibt es wichtige Details zu beachten. Die Verfügbarkeit von Mineralstoffen und die Wahl der richtigen Getreidearten spielen dabei eine zentrale Rolle.</p>



<h3 class="wp-block-heading">Haferflocken bei Glutenunverträglichkeit und Zöliakie</h3>



<p class="wp-block-paragraph">Hafer ist von Natur aus <strong>glutenfrei</strong>, kann aber während der Verarbeitung mit glutenhaltigem Getreide kontaminiert werden. Wenn du an <a href="https://www.verbraucherzentrale.nrw/wissen/lebensmittel/auswaehlen-zubereiten-aufbewahren/haferflocken-regelmaessig-essen-sind-haferflocken-gesund-117957">Zöliakie leidest, solltest du auf zertifiziert glutenfreie Haferflocken</a> achten, um Kreuzverunreinigungen zu vermeiden.</p>



<p class="wp-block-paragraph">Bei einer Glutenunverträglichkeit ohne Zöliakie vertragen viele Menschen normale Haferflocken problemlos. Die Proteinstruktur von Hafer unterscheidet sich von Weizen, Roggen und Gerste.</p>



<p class="wp-block-paragraph"><strong>Glutenfreie Haferflocken</strong> tragen spezielle Zertifizierungen und werden in separaten Produktionslinien hergestellt. Diese Produkte sind zwar etwas teurer, aber für Menschen mit Zöliakie die sichere Wahl. Achte beim Kauf auf entsprechende Siegel, die einen Glutengehalt unter 20 mg/kg garantieren.</p>



<h3 class="wp-block-heading">Phytinsäure und Mineralstoffaufnahme</h3>



<p class="wp-block-paragraph">Haferflocken enthalten Phytinsäure, die einen Teil der Mineralstoffe bindet und deren Aufnahme im Körper reduziert. Durch einfache Zubereitungsmethoden kannst du diesen Effekt minimieren.</p>



<p class="wp-block-paragraph">Das Einweichen über Nacht baut Phytinsäure teilweise ab. <a href="https://www.verbraucherzentrale.nrw/wissen/lebensmittel/auswaehlen-zubereiten-aufbewahren/haferflocken-regelmaessig-essen-sind-haferflocken-gesund-117957">Als Overnight Oats eingeweicht sind Haferflocken leichter verdaulich</a>, und die Nährstoffe werden besser aufgenommen. Das Kochen zu Porridge verbessert zwar die Verdaulichkeit, senkt jedoch den Phytinsäuregehalt weniger stark.</p>



<p class="wp-block-paragraph">Für eine <strong>optimale Mineralstoffaufnahme</strong> kombinierst du Haferflocken mit Vitamin-C-reichen Früchten. Beeren, Kiwi oder Orangensaft verbessern besonders die Eisenaufnahme erheblich.</p>



<h3 class="wp-block-heading">Unterschiede zu anderen Getreidearten und Alternativen</h3>



<p class="wp-block-paragraph">Haferflocken gehören zu den <strong>Vollkorngetreide</strong>-Produkten, unterscheiden sich aber deutlich von anderen Getreidesorten. Während Weizen und Roggen Gluten enthalten, ist Hafer glutenarm bis glutenfrei.</p>



<p class="wp-block-paragraph"><strong>Alternative Getreidearten</strong> bieten Abwechslung im Speiseplan:</p>



<ul class="wp-block-list">
<li><strong>Quinoa</strong>: Proteinreich, enthält alle essentiellen Aminosäuren, kein echtes Getreide</li>



<li><strong>Amaranth</strong>: Reich an Eisen und Calcium, ebenfalls pseudogetreide</li>



<li><strong>Hirse</strong>: Glutenfrei, leicht verdaulich, gut für empfindliche Mägen</li>
</ul>



<p class="wp-block-paragraph">Diese Alternativen enthalten im Gegensatz zu Hafer keine Lektine in nennenswerten Mengen. Quinoa und Amaranth sind zudem von Natur aus glutenfrei und müssen nicht extra zertifiziert werden. Für eine <a href="https://www.verbraucherzentrale.nrw/wissen/lebensmittel/auswaehlen-zubereiten-aufbewahren/haferflocken-regelmaessig-essen-sind-haferflocken-gesund-117957">abwechslungsreiche und bunte Ernährung</a> kannst du zwischen diesen Optionen rotieren und so verschiedene Nährstoffprofile nutzen.</p>



<h2 class="wp-block-heading">Häufig gestellte Fragen</h2>



<p class="wp-block-paragraph">Haferflocken werfen bei vielen Menschen Fragen auf, besonders wenn es um ihre gesundheitlichen Vorteile geht. Die Antworten zeigen, wie diese Getreideflocken Verdauung, Gewicht, Blutzucker und Cholesterin beeinflussen können.</p>



<h3 class="wp-block-heading">Sind Haferflocken gut für die Verdauung?</h3>



<p class="wp-block-paragraph">Ja, Haferflocken sind ausgezeichnet für deine Verdauung. Sie gehören zu den Vollkornprodukten und sind <a href="https://www.aok.de/pk/magazin/ernaehrung/lebensmittel/darum-sind-haferflocken-gesund-sogar-bei-diabetes/">reich an Ballaststoffen</a>, die deinen Darm gesund halten.</p>



<p class="wp-block-paragraph">Eine ballaststoffreiche Ernährung mit Haferflocken kann das Risiko senken, an Darmkrebs zu erkranken. Die Ballaststoffe fördern die Verdauung und helfen bei Verstopfung.</p>



<h3 class="wp-block-heading">Können Haferflocken beim Abnehmen helfen?</h3>



<p class="wp-block-paragraph">Haferflocken können dich tatsächlich beim Abnehmen unterstützen. Durch ihre langkettigen Kohlenhydrate sorgen sie für ein <a href="https://www.aok.de/pk/magazin/ernaehrung/lebensmittel/darum-sind-haferflocken-gesund-sogar-bei-diabetes/">länger anhaltendes Sättigungsgefühl</a>.</p>



<p class="wp-block-paragraph">Du fühlst dich nach einer Portion Haferflocken länger satt und hast weniger Heißhunger zwischendurch. Das macht es leichter, deine Kalorienzufuhr zu kontrollieren.</p>



<h3 class="wp-block-heading">Welche Vitamine und Mineralstoffe findet man in Haferflocken?</h3>



<p class="wp-block-paragraph">Haferflocken enthalten <a href="https://www.aok.de/pk/magazin/ernaehrung/lebensmittel/darum-sind-haferflocken-gesund-sogar-bei-diabetes/">viele Mineralstoffe und wertvolle Vitamine</a>. Sie sind eine gute Quelle für Vitamin B1 (Thiamin) und Biotin.</p>



<p class="wp-block-paragraph">Außerdem liefern sie dir wichtige Mineralstoffe wie Zink, Selen, Magnesium und Folat. Mit 100 Gramm Haferflocken bekommst du auch 13 Gramm Proteine.</p>



<h3 class="wp-block-heading">Wie beeinflussen Haferflocken den Blutzuckerspiegel?</h3>



<p class="wp-block-paragraph">Haferflocken steigern deinen Blutzuckerspiegel nicht so stark wie einfache Kohlenhydrate. Die Getreideflocken gehen nur nach und nach in deine Blutbahn über.</p>



<p class="wp-block-paragraph">Der Ballaststoff Beta-Glucan verlangsamt vermutlich den Übergang des Speisebreis vom Magen in den Dünndarm. Dadurch wird Zucker langsamer aufgenommen und dein <a href="https://www.aok.de/pk/magazin/ernaehrung/lebensmittel/darum-sind-haferflocken-gesund-sogar-bei-diabetes/">Blutzuckerspiegel bleibt stabil</a>.</p>



<h3 class="wp-block-heading">Gibt es einen Unterschied zwischen dem Verzehr von rohen und gekochten Haferflocken bezüglich der Nährstoffaufnahme?</h3>



<p class="wp-block-paragraph">Der größte Unterschied liegt in der Phytinsäure. Rohe Haferflocken enthalten Phytinsäure, die die Aufnahme bestimmter Mineralien wie Eisen, Zink und Kalzium beeinträchtigt.</p>



<p class="wp-block-paragraph">Durch Einweichen über Nacht oder Kochen kannst du die <a href="https://www.aok.de/pk/magazin/ernaehrung/lebensmittel/darum-sind-haferflocken-gesund-sogar-bei-diabetes/">Phytinsäure reduzieren oder sogar ganz entfernen</a>. Gekochte Haferflocken sind außerdem leichter verdaulich für deinen Magen.</p>



<h3 class="wp-block-heading">Können Haferflocken eine Rolle bei der Senkung des Cholesterinspiegels spielen?</h3>



<p class="wp-block-paragraph">Haferflocken können deinen Cholesterinspiegel tatsächlich senken. Der Ballaststoff Beta-Glucan <a href="https://www.aok.de/pk/magazin/ernaehrung/lebensmittel/darum-sind-haferflocken-gesund-sogar-bei-diabetes/">senkt den Cholesterinspiegel im Blut nachweislich</a>.</p>



<p class="wp-block-paragraph">Für Menschen mit hohen Cholesterinwerten sind Haferflocken daher ideal. Auch die LDL-Cholesterin-Werte werden durch eine Haferkur minimiert.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/gesundheit/haferflocken-und-gesundheit-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">334</post-id>	</item>
		<item>
		<title>Deine Flutter Wetter-App: Schritt für Schritt – Teil 6</title>
		<link>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-6/</link>
					<comments>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-6/#respond</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Mon, 16 Jun 2025 21:06:03 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Wetter]]></category>
		<category><![CDATA[Wetter-App Entwicklung]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Flutter]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=326</guid>

					<description><![CDATA[Teil 6: Grünland im Blick – Die Grünlandtemperatursumme (GTS) berechnen und anzeigen Hallo und herzlich willkommen zum sechsten und vorerst letzten Teil unserer Kernserie zur Flutter Wetter-App! In den vorherigen Teilen haben wir eine Menge geschafft: von der Anzeige der aktuellen Temperatur über die Adresssuche bis hin zur Visualisierung des Temperaturverlaufs als Diagramm. Unsere App [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading" id="deine-flutter-wetter-app-schritt-für-schritt--teil-6"><strong>Teil 6: Grünland im Blick – Die Grünlandtemperatursumme (GTS) berechnen und anzeigen</strong></h3>



<p class="wp-block-paragraph">Hallo und herzlich willkommen zum sechsten und vorerst letzten Teil unserer Kernserie zur Flutter Wetter-App!</p>



<p class="wp-block-paragraph">In den <a href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-5/">vorherigen Teilen</a> haben wir eine Menge geschafft: von der Anzeige der aktuellen Temperatur über die Adresssuche bis hin zur Visualisierung des Temperaturverlaufs als Diagramm. Unsere App wird immer nützlicher!</p>



<p class="wp-block-paragraph">Heute krönen wir das Ganze mit einer Spezialfunktion: der Berechnung und Anzeige der <strong>Grünlandtemperatursumme (GTS)</strong>. Dieser agrarmeteorologische Wert ist besonders für Landwirte und Gärtner interessant, da er Aufschluss über den Vegetationsbeginn im Frühjahr gibt. Aber auch für Naturinteressierte ist es eine spannende Ergänzung.</p>



<p class="wp-block-paragraph"><strong>Das Ziel für heute:</strong></p>



<ul class="wp-block-list">
<li>Wir verstehen, was die Grünlandtemperatursumme ist und wie sie berechnet wird.</li>



<li>Wir lernen, wie man <strong>historische Wetterdaten</strong> von einem anderen Endpunkt der Open-Meteo API (der Archiv-API) abruft.</li>



<li>Wir implementieren die <strong>Berechnungslogik</strong> für die GTS, inklusive der Monatsfaktoren.</li>



<li>Wir integrieren einen <strong>Caching-Mechanismus</strong>, um nicht bei jedem App-Start die gesamten historischen Daten neu laden zu müssen.</li>



<li>Wir erstellen ein neues Widget, um die GTS ansprechend darzustellen.</li>
</ul>



<p class="wp-block-paragraph"><strong>Warum GTS?</strong></p>



<p class="wp-block-paragraph">Die GTS ist ein gutes Beispiel dafür, wie man mit Flutter und externen APIs auch spezifischere, fachliche Anforderungen umsetzen kann. Es erfordert Datenabruf, Datenverarbeitung und eine klare Logik.</p>



<p class="wp-block-paragraph"><strong>Schritt 1: Den Code für Teil 6 holen</strong></p>



<p class="wp-block-paragraph">Wie immer findest du den Code für diesen Teil im Git-Repository.</p>



<ol class="wp-block-list">
<li><strong>Öffne ein Terminal</strong> in deinem Projektordner (<code>flutter_weather_app_blog</code>).</li>



<li><strong>Sichere lokale Änderungen, falls vorhanden.</strong></li>



<li><strong>Wechsle zum <code>main</code>-Branch und aktualisiere:</strong><pre><code class="language-bash">git checkout main<br>git pull origin main<br></code></pre><br></li>



<li><strong>Checke den Code-Stand für Teil 6 aus:</strong> (Tag-Name ggf. anpassen)<pre><code class="language-bash">git checkout part6-gts-calculation<br></code></pre><br></li>



<li><strong>Abhängigkeiten holen &amp; Code generieren:</strong><pre><code class="language-bash">flutter pub get<br></code></pre><br><pre><code class="language-bash">dart run build_runner build --delete-conflicting-outputs<br></code></pre><br></li>
</ol>



<p class="wp-block-paragraph">Öffne das Projekt in VS Code.</p>



<p class="wp-block-paragraph"><strong>Schritt 2: Was ist die Grünlandtemperatursumme (GTS)?</strong></p>



<p class="wp-block-paragraph">Die GTS ist die Summe der positiven Tagesmitteltemperaturen (oberhalb von 0°C), die ab Jahresbeginn anfallen. Dabei werden die Werte im Januar mit dem Faktor 0,5 und im Februar mit 0,75 gewichtet. Ab März zählt jeder positive Tagesmittelwert voll (Faktor 1,0). Ein bestimmter Schwellenwert der GTS (oft um 200 °Cd – Grad Celsius Tage) signalisiert den nachhaltigen Beginn der Vegetationsperiode.</p>



<p class="wp-block-paragraph"><strong>Berechnung:</strong>
GTS = Σ (Tagesmittel – 0°C) * Monatsfaktor
(Nur für Tage mit Tagesmittel &gt; 0°C)</p>



<p class="wp-block-paragraph"><strong>Schritt 3: Die Datenquelle – Open-Meteo Archiv-API</strong></p>



<p class="wp-block-paragraph">Um die GTS zu berechnen, benötigen wir die täglichen Durchschnittstemperaturen seit dem 1. Januar des aktuellen Jahres. Die normale Forecast-API von Open-Meteo liefert historische Daten nur für einen begrenzten Zeitraum (z.B. die letzten 7-90 Tage). Für längere historische Zeitreihen bietet Open-Meteo eine separate <strong>Archiv-API</strong>.</p>



<ul class="wp-block-list">
<li><strong>Neue API-Endpunkte (<code>lib/src/core/constants/app_constants.dart</code>):</strong>
<ul class="wp-block-list">
<li>Wir haben Konstanten für die Basis-URL und den Endpunkt der Archiv-API hinzugefügt:<pre><code class="language-dart">static const String openMeteoArchiveApiBaseUrl = 'archive-api.open-meteo.com';<br>static const String openMeteoArchiveEndpoint = '/v1/archive';<br></code></pre><br></li>
</ul>
</li>



<li><strong>Parameter für GTS (<code>lib/src/core/constants/app_constants.dart</code>):</strong>
<ul class="wp-block-list">
<li>Ebenfalls neu sind die Konstanten für die GTS-Berechnung selbst:<pre><code class="language-dart">static const double gtsBaseTemperature = 0.0;<br>static const Map&lt;int, double> gtsMonthlyFactors = {1: 0.5, 2: 0.75};<br>static const int gtsLocationCachePrecision = 2; // Für Caching<br></code></pre><br></li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 4: Datenmodelle für historische Daten (<code>data</code> Layer Models)</strong></p>



<p class="wp-block-paragraph">Die Archiv-API liefert tägliche Daten in einer ähnlichen, aber doch eigenen Struktur. Daher brauchen wir neue Modelle:</p>



<ul class="wp-block-list">
<li><strong><code>lib/src/features/weather/data/models/daily_units_model.dart</code> (NEU):</strong> Analog zum <code>HourlyUnitsModel</code>, aber für tägliche Daten (z.B. Einheit für <code>temperature_2m_mean</code>).</li>



<li><strong><code>lib/src/features/weather/data/models/daily_data_model.dart</code> (NEU):</strong> Bildet das <code>daily</code>-Objekt der Archiv-API ab. Enthält Listen für <code>time</code> (Datum-Strings) und <code>temperature_2m_mean</code> (tägliche Durchschnittstemperaturen). Die <code>fromJson</code>-Methode parst diese in <code>DateTime</code>&#8211; und <code>double</code>-Listen.</li>



<li><strong><code>lib/src/features/weather/data/models/historical_response_model.dart</code> (NEU):</strong> Das Gesamtmodell für die Antwort der Archiv-API, analog zum <code>ForecastResponseModel</code>.</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 5: API-Service erweitern (<code>data</code> Layer Datasource)</strong></p>



<p class="wp-block-paragraph">Der <code>WeatherApiService</code> (<code>lib/src/features/weather/data/datasources/weather_api_service.dart</code>) wurde um eine Methode zum Abruf der historischen Daten erweitert:</p>



<ul class="wp-block-list">
<li><strong><code>getHistoricalDailyTemperatures</code> (NEUE Methode):</strong>
<ul class="wp-block-list">
<li>Nimmt <code>latitude</code>, <code>longitude</code>, <code>startDate</code> und <code>endDate</code> als Parameter.</li>



<li>Baut die URL für den Archiv-API-Endpunkt (aus <code>AppConstants</code>).</li>



<li>Fordert <code>daily=temperature_2m_mean</code> an.</li>



<li>Parst die JSON-Antwort mithilfe des neuen <code>HistoricalResponseModel</code>.</li>



<li>Enthält robustes Error-Handling, ähnlich wie <code>getForecastWeather</code>.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 6: Der GTS-Berechnungsservice (<code>application</code> Layer)</strong></p>



<p class="wp-block-paragraph">Die eigentliche Logik zur Berechnung der GTS und das Caching der dafür benötigten Daten haben wir in einen neuen Service ausgelagert:</p>



<ul class="wp-block-list">
<li><strong><code>lib/src/features/weather/application/gts_calculator_service.dart</code> (NEU):</strong>
<ul class="wp-block-list">
<li><strong>Riverpod Provider:</strong> Wird über <code>@riverpod</code> bereitgestellt (<code>gtsCalculatorServiceProvider</code>) und bekommt den <code>WeatherApiService</code> injiziert.</li>



<li><strong>Caching:</strong> Implementiert einen einfachen In-Memory-Cache (<code>_historicalDataCache</code>, <code>_forecastForGtsCache</code>).
<ul class="wp-block-list">
<li><code>_getLocationCacheKey</code>: Erstellt einen eindeutigen Schlüssel für den Cache basierend auf gerundeten Koordinaten (um Ungenauigkeiten durch GPS zu minimieren).</li>



<li>Vor einem API-Aufruf wird geprüft, ob gültige Daten im Cache vorhanden sind (<code>_cacheDuration</code>).</li>
</ul>
</li>



<li><strong><code>calculateGtsForLocation(LocationInfo location)</code> Methode:</strong>
<ol class="wp-block-list">
<li><strong>Cache-Prüfung:</strong> Versucht, historische Tagesmittelwerte aus dem Cache zu laden.</li>



<li><strong>API-Abruf (historisch):</strong> Wenn nicht im Cache, ruft es <code>_apiService.getHistoricalDailyTemperatures</code> auf, um die Tagesmittelwerte vom 1. Januar bis gestern zu holen. Speichert das Ergebnis im Cache.</li>



<li><strong>Datenaufbereitung:</strong> Die erhaltenen Daten werden in einer <code>Map&lt;DateTime, double></code> (Datum -> Temperatur) gespeichert.</li>



<li><strong>Forecast-Ergänzung (Lücke füllen):</strong> Die Archiv-API liefert oft Daten nur bis zum Vortag. Wenn die letzten Tage des aktuellen Jahres fehlen, um bis &#8222;gestern&#8220; zu kommen (z.B. weil die Archivdaten noch nicht aktualisiert sind), versucht der Service, diese Lücke mit stündlichen Daten aus der <em>Forecast</em>-API zu füllen.
<ul class="wp-block-list">
<li>Dafür wird <code>_apiService.getForecastWeather</code> mit <code>past_days</code> (um die Lücke abzudecken) und <code>forecast_days: 0</code> aufgerufen.</li>



<li>Aus den stündlichen Forecast-Daten werden dann Tagesmittelwerte für die fehlenden Tage berechnet und zu den <code>dailyAverages</code> hinzugefügt. Auch diese Forecast-Daten werden gecacht.</li>
</ul>
</li>



<li><strong>GTS-Summation:</strong> Iteriert durch alle Tage des aktuellen Jahres (bis gestern) in der <code>dailyAverages</code>-Map.
<ul class="wp-block-list">
<li>Wenn die Tagesmitteltemperatur > <code>gtsBaseTemperature</code> (0°C) ist:</li>



<li>Der entsprechende <code>gtsMonthlyFactor</code> (Jan: 0.5, Feb: 0.75, sonst 1.0) wird angewendet.</li>



<li>Der Beitrag des Tages <code>(Tagesmittel - Basis) * Faktor</code> wird zur Gesamtsumme addiert.</li>
</ul>
</li>



<li>Gibt die berechnete <code>gtsSum</code> zurück.</li>
</ol>
</li>



<li><strong>Fehlerbehandlung:</strong> Wirft <code>GtsCalculationException</code> bei Problemen.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 7: Datenmodell und Repository anpassen (<code>domain</code> &amp; <code>data</code> Layer)</strong></p>



<ul class="wp-block-list">
<li><strong><code>WeatherData</code> Entität (<code>lib/src/features/weather/domain/entities/weather_data.dart</code>):</strong>
<ul class="wp-block-list">
<li>Wurde um das Feld <code>final double greenlandTemperatureSum;</code> erweitert.</li>



<li>Die <code>empty</code> und <code>copyWith</code> Methoden wurden angepasst.</li>
</ul>
</li>



<li><strong><code>WeatherRepositoryImpl</code> (<code>lib/src/features/weather/data/repositories/weather_repository_impl.dart</code>):</strong>
<ul class="wp-block-list">
<li><strong>Abhängigkeit:</strong> Bekommt jetzt den <code>GtsCalculatorService</code> über den Konstruktor injiziert (dank Riverpod).</li>



<li><strong><code>getWeatherForLocation</code>-Methode:</strong>
<ul class="wp-block-list">
<li>Startet den Aufruf von <code>_apiService.getForecastWeather()</code> (für aktuelle und stündliche Daten) und <code>_gtsCalculatorService.calculateGtsForLocation()</code> <strong>parallel</strong> mit <code>Future</code>s.</li>



<li>Wartet mit <code>await</code> auf beide Ergebnisse.</li>



<li>Fängt Fehler von <code>calculateGtsForLocation</code> ab und gibt in diesem Fall <code>double.nan</code> für die GTS zurück, damit der Rest der Wetterdaten trotzdem angezeigt werden kann.</li>



<li>Fügt den erhaltenen <code>gtsValue</code> beim Erstellen des <code>WeatherData</code>-Objekts hinzu.</li>



<li>Kann jetzt auch <code>GtsCalculationException</code> fangen und in <code>GtsFailure</code> umwandeln.</li>
</ul>
</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 8: Anzeige der GTS (<code>presentation</code> Layer)</strong></p>



<ul class="wp-block-list">
<li><strong><code>lib/src/features/weather/presentation/widgets/gts_display.dart</code> (NEU):</strong>
<ul class="wp-block-list">
<li>Ein neues <code>StatelessWidget</code>, das den <code>gtsValue</code> als Parameter erhält.</li>



<li>Stellt die GTS in einer <code>Card</code> ansprechend dar, inklusive Icon und Einheit (°Cd).</li>



<li>Zeigt &#8222;&#8211;&#8220; an, wenn der <code>gtsValue</code> <code>double.nan</code> ist (also ein Fehler bei der Berechnung auftrat).</li>
</ul>
</li>



<li><strong><code>lib/src/features/weather/presentation/screens/weather_screen.dart</code>:</strong>
<ul class="wp-block-list">
<li>In der <code>_buildSuccessContent</code>-Methode wird nun das neue <code>GtsDisplay</code>-Widget hinzugefügt und bekommt <code>data.greenlandTemperatureSum</code> übergeben. Es wird zwischen der aktuellen Temperaturanzeige und dem Diagramm platziert.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 9: Änderungen am State Management (<code>application</code> Layer)</strong></p>



<p class="wp-block-paragraph">Überraschenderweise sind hier <strong>keine Änderungen</strong> im <code>WeatherState</code> oder <code>WeatherNotifier</code> direkt nötig!</p>



<ul class="wp-block-list">
<li>Der <code>WeatherState</code> verwendet bereits das <code>WeatherData</code>-Objekt, das nun das <code>greenlandTemperatureSum</code>-Feld enthält.</li>



<li>Der <code>WeatherNotifier</code> ruft das <code>WeatherRepository</code> auf, das nun ein <code>WeatherData</code>-Objekt mit befüllter GTS zurückliefert. Der Notifier reicht dieses Objekt einfach an den State weiter.</li>
</ul>



<p class="wp-block-paragraph">Das ist ein weiterer Beleg für die Vorteile einer guten Entkopplung: Die UI und der State-Notifier müssen die Details der GTS-Berechnung nicht kennen.</p>



<p class="wp-block-paragraph"><strong>Schritt 10: Ausführen und Testen!</strong></p>



<p class="wp-block-paragraph">Starte die App (<code>F5</code>):</p>



<ol class="wp-block-list">
<li>Lade das Wetter für einen Ort (GPS oder Suche).</li>



<li>Unter der aktuellen Temperatur und vor dem Diagramm sollte nun eine neue Karte mit der <strong>Grünlandtemperatursumme</strong> erscheinen.</li>



<li><strong>Beobachte die Logs:</strong> Du solltest sehen, wie der <code>GtsCalculatorService</code> arbeitet, historische und ggf. Forecast-Daten für die Ergänzung abruft. Beim zweiten Laden für denselben Ort (innerhalb der Cache-Dauer) sollten die Daten schneller aus dem Cache kommen.</li>



<li><strong>Vergleich (optional):</strong> Wenn du Zugang zu offiziellen GTS-Werten für deinen Ort hast, kannst du versuchen, die Ergebnisse zu vergleichen. Beachte, dass es leichte Abweichungen geben kann, je nach genauer Datenquelle und Methodik der offiziellen Stellen.</li>
</ol>



<p class="wp-block-paragraph"><strong>Fazit und Abschluss der Kernserie</strong></p>



<p class="wp-block-paragraph">Herzlichen Glückwunsch! Du hast die Grünlandtemperatursumme erfolgreich in deine Wetter-App integriert. Damit haben wir alle Kernfunktionen umgesetzt, die wir uns am Anfang vorgenommen hatten.</p>



<p class="wp-block-paragraph">In diesem Teil hast du gelernt:</p>



<ul class="wp-block-list">
<li>Wie man Daten von einem <strong>anderen API-Endpunkt</strong> (Archiv-API) abruft.</li>



<li>Wie man <strong>historische Daten</strong> verarbeitet.</li>



<li>Wie man eine spezifische <strong>fachliche Berechnung</strong> (GTS mit Monatsfaktoren) implementiert.</li>



<li>Wie man einen einfachen <strong>In-Memory-Cache</strong> erstellt und nutzt, um API-Anfragen zu reduzieren.</li>



<li>Wie man Daten aus verschiedenen Quellen (historisch, Forecast) <strong>kombiniert</strong>, um ein vollständiges Bild zu erhalten.</li>



<li>Wie eine gut strukturierte App das Hinzufügen komplexer Logik erleichtert, ohne dass alle Teile der App angepasst werden müssen.</li>
</ul>



<p class="wp-block-paragraph">Unsere Wetter-App ist nun ein ziemlich umfassendes Projekt, das viele Aspekte der Flutter-Entwicklung abdeckt. Du hast eine solide Grundlage geschaffen, auf der du aufbauen und weitere Ideen umsetzen kannst!</p>



<p class="wp-block-paragraph"><strong>Wie geht es weiter?</strong></p>



<p class="wp-block-paragraph">Das war das Ende der geplanten <em>Kernfunktionen</em>. Aber eine App ist selten &#8222;fertig&#8220;. Mögliche nächste Schritte könnten sein:</p>



<ul class="wp-block-list">
<li><strong>UI-Verfeinerungen:</strong> Icons für Wetterbedingungen, schönere Übergänge, Anpassung an verschiedene Bildschirmgrößen.</li>



<li><strong>Weitere Wetterdaten:</strong> Windgeschwindigkeit, Luftfeuchtigkeit, Sonnenaufgang/-untergang.</li>



<li><strong>Einstellungen:</strong> Wahl der Temperatureinheit (Celsius/Fahrenheit), Anpassung der Diagramm-Optik.</li>



<li><strong>Caching verbessern:</strong> Persistenter Cache (z.B. mit <code>shared_preferences</code> oder einer lokalen Datenbank).</li>



<li><strong>Testing vertiefen:</strong> Mehr Unit-, Widget- und Integration-Tests schreiben.</li>



<li><strong>Fehler-Reporting:</strong> Integration eines Dienstes wie Sentry oder Firebase Crashlytics.</li>



<li><strong>Deployment:</strong> Die App für den Google Play Store vorbereiten und veröffentlichen.</li>
</ul>



<p class="wp-block-paragraph">Ich hoffe, diese Serie hat dir Spaß gemacht und dir geholfen, Flutter und die App-Entwicklung besser zu verstehen. Nutze das Gelernte als Sprungbrett für deine eigenen Projekte!</p>



<p class="wp-block-paragraph">Vielen Dank fürs Mitmachen und viel Erfolg bei deinen zukünftigen Flutter-Abenteuern!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Weiterführende Ressourcen &amp; Vertiefung </strong></p>



<ol class="wp-block-list">
<li><strong>Open-Meteo Archiv API:</strong>
<ul class="wp-block-list">
<li><strong>Dokumentation:</strong> <a href="https://open-meteo.com/en/docs/historical-weather-api">https://open-meteo.com/en/docs/historical-weather-api</a> &#8211; Details zu den verfügbaren Parametern und Daten der Archiv-API.</li>
</ul>
</li>



<li><strong>Grünlandtemperatursumme (GTS):</strong>
<ul class="wp-block-list">
<li><strong>Agrarmeteorologische Informationen:</strong> Suche nach &#8222;Grünlandtemperatursumme Erklärung&#8220; oder &#8222;GTS Landwirtschaft&#8220;, um mehr über die Bedeutung und Berechnungsmethoden zu erfahren (z.B. von Wetterdiensten oder landwirtschaftlichen Portalen).</li>
</ul>
</li>



<li><strong>Caching-Strategien in Flutter:</strong>
<ul class="wp-block-list">
<li><strong>Einfaches In-Memory Caching:</strong> Wie wir es implementiert haben, ist ein guter Start.</li>



<li><strong><code>shared_preferences</code>:</strong> <a href="https://pub.dev/packages/shared_preferences">https://pub.dev/packages/shared_preferences</a> &#8211; Für das Speichern einfacher Schlüssel-Wert-Paare (kleine Datenmengen, die auch nach App-Neustart erhalten bleiben).</li>



<li><strong>Lokale Datenbanken (z.B. <code>sqflite</code>):</strong> <a href="https://pub.dev/packages/sqflite">https://pub.dev/packages/sqflite</a> &#8211; Für komplexere, strukturierte Daten, die persistent gespeichert werden sollen.</li>
</ul>
</li>



<li><strong>Parallele Ausführung mit <code>Future</code>:</strong>
<ul class="wp-block-list">
<li><strong>Dart Dokumentation (Concurrency):</strong> <a href="https://dart.dev/language/concurrency">https://dart.dev/language/concurrency</a> &#8211; Erklärt <code>Future</code>s und wie man asynchrone Operationen handhabt.</li>



<li><strong><code>Future.wait</code>:</strong> <a href="https://api.dart.dev/stable/dart-async/Future/wait.html">https://api.dart.dev/stable/dart-async/Future/wait.html</a> &#8211; Nützlich, wenn man auf mehrere Futures warten muss, bevor man fortfährt (wir haben sie hier sequentiell nach dem Starten awaited, aber <code>Future.wait</code> ist eine Alternative für bestimmte Szenarien).</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">326</post-id>	</item>
		<item>
		<title>Deine Flutter Wetter-App: Schritt für Schritt – Teil 5</title>
		<link>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-5/</link>
					<comments>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-5/#comments</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Tue, 03 Jun 2025 19:31:15 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Wetter]]></category>
		<category><![CDATA[Wetter-App Entwicklung]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[fl_chart]]></category>
		<category><![CDATA[Flutter]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=304</guid>

					<description><![CDATA[Teil 5: Kurven zeichnen – Temperaturverläufe mit Diagrammen visualisieren Hallo und herzlich willkommen zurück! In Teil 4 haben wir unserer Wetter-App eine wichtige Funktion spendiert: die Adresssuche. Nun können wir das aktuelle Wetter nicht nur für unseren GPS-Standort, sondern für jeden beliebigen Ort abfragen. Das ist schon ziemlich cool! Aber oft sagt ein Bild mehr [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Teil 5: Kurven zeichnen – Temperaturverläufe mit Diagrammen visualisieren</strong></p>



<p class="wp-block-paragraph">Hallo und herzlich willkommen zurück!</p>



<p class="wp-block-paragraph">In <a href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/">Teil 4</a> haben wir unserer Wetter-App eine wichtige Funktion spendiert: die Adresssuche. Nun können wir das aktuelle Wetter nicht nur für unseren GPS-Standort, sondern für jeden beliebigen Ort abfragen. Das ist schon ziemlich cool!</p>



<p class="wp-block-paragraph">Aber oft sagt ein Bild mehr als tausend Worte – oder in unserem Fall, eine einzelne Temperaturzahl. Wie hat sich die Temperatur entwickelt? Was erwartet uns in den nächsten Tagen? Um diese Fragen zu beantworten, werden wir heute ein <strong>Liniendiagramm</strong> in unsere App integrieren, das den Temperaturverlauf der letzten 7 Tage und eine Prognose für die nächsten 7 Tage anzeigt.</p>



<p class="wp-block-paragraph"><strong>Das Ziel für heute:</strong></p>



<ul class="wp-block-list">
<li>Wir untersuchen den Code für Teil 5 aus unserem Repository.</li>



<li>Wir lernen das <code>fl_chart</code>-Paket kennen, ein mächtiges Werkzeug zur Erstellung von Diagrammen in Flutter.</li>



<li>Wir passen unsere Datenabfrage an, um auch <strong>stündliche Temperaturdaten</strong> von Open-Meteo zu erhalten.</li>



<li>Wir sehen, wie diese Daten in eine für das Diagramm geeignete Form gebracht werden.</li>



<li>Wir bauen ein neues Widget (<code>TemperatureChart</code>), das die Daten visualisiert, inklusive Achsenbeschriftung, geglätteter Linie und interaktiven Tooltips.</li>
</ul>



<p class="wp-block-paragraph"><strong>Warum Diagramme?</strong></p>



<p class="wp-block-paragraph">Diagramme sind ein hervorragendes Mittel, um Trends und Muster in Daten schnell erfassbar zu machen. Ein Blick auf die Temperaturkurve gibt uns ein viel besseres Gefühl für das Wetter als nur die aktuelle Zahl. Für unser Lernprojekt ist es außerdem eine tolle Gelegenheit, uns mit Datenvisualisierung in Flutter auseinanderzusetzen.</p>



<figure class="wp-block-image"><img fetchpriority="high" decoding="async" width="390" height="893" data-attachment-id="323" data-permalink="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-5/attachment/clipboard01-2/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/05/Clipboard01.jpg" data-orig-size="390,893" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Verlauf und Prognose" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/05/Clipboard01.jpg" src="https://allround-blog.de/wp-content/uploads/2025/05/Clipboard01.jpg" alt="" class="wp-image-323" srcset="https://allround-blog.de/wp-content/uploads/2025/05/Clipboard01.jpg 390w, https://allround-blog.de/wp-content/uploads/2025/05/Clipboard01-131x300.jpg 131w" sizes="(max-width: 390px) 100vw, 390px" /></figure>



<p class="wp-block-paragraph"><strong>Schritt 1: Den Code für Teil 5 holen</strong></p>



<p class="wp-block-paragraph">Der Code für diesen Beitrag ist wie gewohnt im Git-Repository vorbereitet.</p>



<ol class="wp-block-list">
<li><strong>Öffne ein Terminal</strong> in deinem Projektordner (<code>flutter_weather_app_blog</code>).</li>



<li><strong>Stelle sicher, dass du keine ungespeicherten Änderungen hast.</strong></li>



<li><strong>Wechsle zum <code>main</code>-Branch und aktualisiere:</strong><pre><code class="language-bash">git checkout main<br>git pull origin main<br></code></pre></li>



<li><strong>Checke den Code-Stand für Teil 5 aus:</strong> (Tag-Name ggf. anpassen)<pre><code class="language-bash">git checkout part5-temperature-chart<br></code></pre><em>(Denke an die &#8218;detached HEAD&#8216;-Meldung.)</em></li>



<li><strong>Ganz wichtig: Abhängigkeiten holen &amp; Code generieren:</strong><pre><code class="language-bash">flutter pub get<br>dart run build_runner build --delete-conflicting-outputs<br></code></pre><em>(Wir haben das <code>fl_chart</code>-Paket hinzugefügt und einige Datenmodelle erweitert.)</em></li>
</ol>



<p class="wp-block-paragraph">Öffne das Projekt nun in VS Code. Auf den ersten Blick sieht die App vielleicht noch nicht viel anders aus, aber unter der Haube hat sich einiges getan, um die Diagrammdarstellung vorzubereiten und zu implementieren.</p>



<p class="wp-block-paragraph"><strong>Schritt 2: Die neue Werkzeugkiste – Das <code>fl_chart</code>-Paket</strong></p>



<p class="wp-block-paragraph">Um Diagramme zu zeichnen, ohne das Rad neu erfinden zu müssen, verwenden wir ein beliebtes Flutter-Paket namens <code>fl_chart</code>.</p>



<ul class="wp-block-list">
<li><strong><code>pubspec.yaml</code>:</strong> In dieser Datei findest du unter <code>dependencies:</code> den neuen Eintrag:<pre><code class="language-yaml">dependencies:<br>  # ... andere Pakete ...<br>  fl_chart: ^0.68.0 # Version prüfen<br></code></pre><br><code>fl_chart</code> ist sehr vielseitig und unterstützt verschiedene Diagrammtypen (Linien-, Balken-, Kreisdiagramme etc.). Wir konzentrieren uns auf Liniendiagramme.</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 3: Mehr Daten von der API – Stündliche Temperaturen</strong></p>



<p class="wp-block-paragraph">Unser Diagramm soll einen Verlauf über 14 Tage zeigen (7 Vergangenheit, 7 Zukunft). Dafür brauchen wir detailliertere Daten als nur die aktuelle Temperatur.</p>



<ul class="wp-block-list">
<li><strong><code>WeatherApiService</code> (<code>lib/src/features/weather/data/datasources/weather_api_service.dart</code>):</strong>
<ul class="wp-block-list">
<li>Die Methode <code>getCurrentWeather</code> wurde umbenannt zu <code>getForecastWeather</code>, da sie jetzt mehr als nur die aktuellen Daten liefert.</li>



<li><strong>Entscheidende Änderung in den <code>queryParameters</code>:</strong><pre><code class="language-dart">// Ausschnitt aus getForecastWeather in WeatherApiService<br>final queryParameters = {<br>  // ... latitude, longitude, current_weather ...<br>  'hourly': 'temperature_2m', // NEU: Fordert stündliche Temperaturdaten an<br>  'past_days': pastDays.toString(), // NEU: z.B. 7<br>  'forecast_days': forecastDays.toString(), // NEU: z.B. 7<br>  // ... timezone ...<br>};<br></code></pre><br>Wir fordern jetzt explizit <code>hourly=temperature_2m</code> an und spezifizieren über <code>past_days</code> und <code>forecast_days</code> den gewünschten Zeitraum. Open-Meteo liefert uns dann eine lange Liste von Zeitstempeln und den dazugehörigen Temperaturen im 2-Meter-Höhenintervall.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 4: Die neuen Datenstrukturen (<code>data</code> Layer Models)</strong></p>



<p class="wp-block-paragraph">Die API liefert die stündlichen Daten in einer spezifischen Struktur. Wir brauchen neue Dart-Klassen (Models), um diese abzubilden:</p>



<ul class="wp-block-list">
<li><strong><code>lib/src/features/weather/data/models/hourly_units_model.dart</code> (NEU):</strong>
<ul class="wp-block-list">
<li>Open-Meteo sendet ein separates Objekt <code>hourly_units</code>, das die Einheiten für die stündlichen Werte angibt (z.B. <code>"time": "iso8601"</code>, <code>"temperature_2m": "°C"</code>). Diese kleine Klasse bildet das ab.</li>
</ul>
</li>



<li><strong><code>lib/src/features/weather/data/models/hourly_data_model.dart</code> (NEU):</strong>
<ul class="wp-block-list">
<li>Das ist das Herzstück der neuen API-Daten. Es bildet das <code>hourly</code>-Objekt aus der API-Antwort ab, das typischerweise zwei Listen enthält:
<ul class="wp-block-list">
<li><code>time</code>: Eine Liste von Zeitstempel-Strings (z.B. <code>"2023-10-27T10:00"</code>).</li>



<li><code>temperature_2m</code>: Eine Liste von Temperaturwerten (Zahlen).</li>
</ul>
</li>



<li>Die <code>fromJson</code>-Methode in dieser Klasse ist wichtig: Sie nimmt die rohen Listen aus dem JSON, parst die Zeitstempel-Strings mit unserem <code>DateFormatter.tryParseApiDateTime</code> in <code>DateTime</code>-Objekte und wandelt die Temperaturwerte in <code>double</code> um. Sie stellt auch sicher, dass beide Listen die gleiche Länge haben und behandelt fehlerhafte oder fehlende Werte (z.B. indem sie <code>double.nan</code> für ungültige Temperaturen verwendet).</li>
</ul>
</li>



<li><strong><code>lib/src/features/weather/data/models/forecast_response_model.dart</code> (GEÄNDERT):</strong>
<ul class="wp-block-list">
<li>Unser Haupt-Antwortmodell wurde erweitert, um die neuen <code>HourlyUnitsModel</code> und <code>HourlyDataModel</code> aufzunehmen:<pre><code class="language-dart">// Ausschnitt aus ForecastResponseModel<br>class ForecastResponseModel {<br>  // ... bestehende Felder ...<br>  final CurrentWeatherModel? currentWeather;<br>  final HourlyUnitsModel? hourlyUnits; // NEU<br>  final HourlyDataModel? hourly;       // NEU<br><br>  // Konstruktor und toJson angepasst...<br><br>  factory ForecastResponseModel.fromJson(Map json) {<br>    // ... bestehendes Parsing ...<br>    final units = json.containsKey('hourly_units') /* ... */ ? HourlyUnitsModel.fromJson(json['hourly_units']) : null;<br>    final data = json.containsKey('hourly') /* ... */ ? HourlyDataModel.fromJson(json['hourly']) : null;<br>    return ForecastResponseModel(<br>      // ...<br>      hourlyUnits: units,<br>      hourly: data,<br>    );<br>  }<br>}<br></code></pre><br></li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 5: Die App-internen Daten (<code>domain</code> Layer Entities)</strong></p>



<p class="wp-block-paragraph">Unsere App-Logik und UI sollten nicht direkt mit den API-spezifischen Models arbeiten. Wir brauchen eine saubere, app-interne Repräsentation der Daten.</p>



<ul class="wp-block-list">
<li><strong><code>lib/src/features/weather/domain/entities/chart_point.dart</code> (NEU):</strong>
<ul class="wp-block-list">
<li>Eine sehr einfache Klasse, die einen einzelnen Punkt im Diagramm repräsentiert:<pre><code class="language-dart">class ChartPoint extends Equatable {<br>  final DateTime time;      // X-Wert<br>  final double temperature; // Y-Wert<br>  // ... Konstruktor, props ...<br>}<br></code></pre><br></li>
</ul>
</li>



<li><strong><code>lib/src/features/weather/domain/entities/weather_data.dart</code> (GEÄNDERT/ERSETZT):</strong>
<ul class="wp-block-list">
<li>Diese Entität, die bisher nur <code>CurrentWeatherData</code> hieß und nur die aktuelle Temperatur enthielt, wurde nun zur zentralen <code>WeatherData</code>-Klasse.</li>



<li>Sie enthält jetzt zusätzlich eine Liste von <code>ChartPoint</code>-Objekten für den Temperaturverlauf:<pre><code class="language-dart">// Ausschnitt aus WeatherData<br>class WeatherData extends Equatable {<br>  final double currentTemperature;<br>  final DateTime? lastUpdatedTime;<br>  final List hourlyForecast; // NEU<br><br>  // Konstruktor, props, empty, copyWith angepasst...<br>}<br></code></pre><br></li>



<li>(Die alte <code>current_weather_data.dart</code> kann gelöscht werden, wenn sie nicht mehr referenziert wird.)</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 6: Datenaufbereitung im Repository (<code>data</code> Layer)</strong></p>



<p class="wp-block-paragraph">Das <code>WeatherRepositoryImpl</code> (<code>lib/src/features/weather/data/repositories/weather_repository_impl.dart</code>) ist dafür zuständig, die Rohdaten vom <code>WeatherApiService</code> zu holen und sie in unsere App-internen <code>WeatherData</code>-Entität umzuwandeln.</p>



<ul class="wp-block-list">
<li><strong><code>getWeatherForLocation</code>-Methode (GEÄNDERT):</strong>
<ul class="wp-block-list">
<li>Ruft jetzt <code>_apiService.getForecastWeather()</code> auf (die umbenannte Methode, die auch stündliche Daten holt).</li>



<li>Nachdem die aktuelle Temperatur extrahiert wurde, iteriert es durch die <code>time</code>&#8211; und <code>temperature_2m</code>-Listen aus dem <code>forecastResponse.hourly</code>-Objekt.</li>



<li>Für jedes gültige Zeit/Temperatur-Paar wird ein <code>ChartPoint</code>-Objekt erstellt und der <code>hourlyPoints</code>-Liste hinzugefügt. Ungültige Temperaturen (<code>NaN</code>) werden übersprungen.</li>



<li>Am Ende wird das <code>WeatherData</code>-Objekt mit <code>currentTemperature</code>, <code>lastUpdatedTime</code> und der <code>hourlyForecast</code>-Liste erstellt und zurückgegeben.</li>



<li>Das Interface <code>WeatherRepository</code> (<code>domain/repositories/weather_repository.dart</code>) wurde natürlich angepasst, sodass <code>getWeatherForLocation</code> jetzt <code>Future&amp;lt;Either&gt;</code> zurückgibt.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 7: State Management (<code>application</code> Layer)</strong></p>



<p class="wp-block-paragraph">Die Änderungen im <code>WeatherState</code> und <code>WeatherNotifier</code> sind minimal, da unsere Architektur gut vorbereitet war.</p>



<ul class="wp-block-list">
<li><strong><code>lib/src/features/weather/application/weather_state.dart</code> (GEÄNDERT):</strong>
<ul class="wp-block-list">
<li>Das Feld <code>currentWeatherData</code> wurde durch <code>weatherData</code> (vom Typ <code>WeatherData</code>, unserer neuen, umfassenderen Entität) ersetzt.</li>



<li>Die <code>initial()</code> und <code>copyWith()</code> Methoden wurden entsprechend angepasst.</li>
</ul>
</li>



<li><strong><code>lib/src/features/weather/application/weather_notifier.dart</code> (MINIMAL GEÄNDERT):</strong>
<ul class="wp-block-list">
<li>Die Methode <code>_fetchWeatherDataAndUpdateState</code> nimmt nun <code>WeatherData</code> vom Repository entgegen und speichert es im <code>weatherData</code>-Feld des <code>WeatherState</code>. Die Logik an sich bleibt gleich, da das Repository die Hauptarbeit der Datenumwandlung übernimmt.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 8: Das Diagramm-Widget (<code>presentation</code> Layer)</strong></p>



<p class="wp-block-paragraph">Jetzt kommt der spannende Teil – die Visualisierung!</p>



<ul class="wp-block-list">
<li><p><strong><code>lib/src/features/weather/presentation/widgets/temperature_chart.dart</code> (NEU):</strong></p>
<ul class="wp-block-list">
<li>Dies ist ein neues <code>StatelessWidget</code>, das die <code>chartData</code> (eine <code>List</code>) als Parameter erwartet.</li>



<li><strong>Kernstück: <code>LineChart</code> von <code>fl_chart</code>:</strong>
<ul class="wp-block-list">
<li><strong><code>LineChartData</code>:</strong> Konfiguriert das gesamte Diagramm.</li>



<li><strong><code>lineBarsData</code>:</strong> Definiert die Linien. Wir haben eine <code>LineChartBarData</code>.
<ul class="wp-block-list">
<li><code>spots</code>: Hier werden unsere <code>ChartPoint</code>-Objekte in <code>FlSpot</code>-Objekte umgewandelt, die <code>fl_chart</code> versteht (<code>FlSpot(zeit_als_double, temperatur)</code>).</li>



<li><code>isCurved: true</code>: Macht die Linie schön weich.</li>



<li><code>color</code>, <code>barWidth</code>: Aussehen der Linie.</li>



<li><code>dotData: FlDotData(show: false)</code>: Wir zeigen keine einzelnen Punkte auf der Linie an.</li>



<li><code>belowBarData</code>: Füllt den Bereich unter der Linie mit einem Farbverlauf (optional, aber schick).</li>
</ul>
</li>



<li><strong><code>titlesData</code>:</strong> Konfiguriert die Achsenbeschriftungen.
<ul class="wp-block-list">
<li><code>bottomTitles</code>: Für die X-Achse (Zeit). <code>getTitlesWidget</code> ist eine Funktion, die für jeden Achsenpunkt ein Widget zurückgibt. Wir formatieren hier den Zeitstempel mit unserem <code>DateFormatter.formatChartAxisDay</code> (z.B. &#8222;Mo 15.07.&#8220;) und zeigen nur alle paar Tage ein Label, um Überlappung zu vermeiden. Die <code>SideTitleWidget(meta: meta, ...)</code> Konstruktion ist hier wichtig.</li>



<li><code>leftTitles</code>: Für die Y-Achse (Temperatur). Zeigt Temperaturwerte in sinnvollen Intervallen (z.B. alle 5 Grad).</li>
</ul>
</li>



<li><strong><code>gridData</code>:</strong> Zeichnet das Hintergrundgitter.</li>



<li><strong><code>borderData</code>:</strong> Zeichnet einen Rahmen um das Diagramm.</li>



<li><strong><code>lineTouchData</code>:</strong> Ermöglicht Interaktion.
<ul class="wp-block-list">
<li><code>touchTooltipData</code>: Konfiguriert die Tooltips, die erscheinen, wenn man auf die Linie tippt. <code>getTooltipItems</code> erstellt den Inhalt des Tooltips (Datum, Uhrzeit, Temperatur). <code>getTooltipColor</code> (früher <code>tooltipBgColor</code>) setzt die Hintergrundfarbe des Tooltips.</li>
</ul>
</li>



<li><code>minY</code>, <code>maxY</code>: Bestimmen den sichtbaren Bereich der Y-Achse. Wir berechnen diese dynamisch aus den Daten und fügen etwas Puffer hinzu.</li>
</ul>
</li>



<li><strong>Deutsche Tageskürzel:</strong> In <code>lib/main.dart</code> haben wir <code>initializeDateFormatting('de_DE', null);</code> hinzugefügt. Dadurch verwendet <code>DateFormat</code> im <code>DateFormatter</code> standardmäßig deutsche Formate, also auch &#8222;Mo, Di, Mi&#8230;&#8220; für die Tageskürzel in der X-Achsen-Beschriftung.</li>
</ul>
</li>



<li><p><strong><code>lib/src/features/weather/presentation/screens/weather_screen.dart</code> (GEÄNDERT):</strong></p>
<ul class="wp-block-list">
<li><strong><code>_buildSuccessContent</code> (NEUE Hilfsmethode):</strong> Um den <code>_buildContent</code>-Switch übersichtlich zu halten, wurde der Code, der bei <code>WeatherStatus.success</code> angezeigt wird, in diese neue Methode ausgelagert.</li>



<li>Innerhalb von <code>_buildSuccessContent</code> wird nun zusätzlich zum <code>CurrentTemperatureDisplay</code> auch das <code>TemperatureChart</code>-Widget hinzugefügt. Es bekommt <code>data.hourlyForecast</code> (wobei <code>data</code> hier das <code>WeatherData</code>-Objekt aus dem State ist) übergeben.</li>



<li>Die gesamte Erfolgsansicht ist in eine <code>ListView</code> gewickelt, damit der Inhalt scrollbar wird, falls er nicht auf den Bildschirm passt (was mit dem Diagramm nun der Fall sein kann).</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 9: Ausführen und Bestaunen!</strong></p>



<p class="wp-block-paragraph">Starte die App (<code>F5</code>):</p>



<ol class="wp-block-list">
<li>Lasse das Wetter für deinen aktuellen Standort oder einen gesuchten Ort laden.</li>



<li>Unter der aktuellen Temperatur solltest du nun ein <strong>Liniendiagramm</strong> sehen!</li>



<li><strong>Interaktion:</strong> Tippe auf verschiedene Punkte der Linie. Ein Tooltip sollte mit dem genauen Datum, der Uhrzeit und der Temperatur für diesen Punkt erscheinen.</li>



<li><strong>Verlauf:</strong> Die Linie sollte die Temperatur der letzten 7 Tage (Vergangenheit) und der nächsten 7 Tage (Prognose) darstellen.</li>



<li><strong>Achsen:</strong> Die X-Achse sollte Tage anzeigen (z.B. &#8222;Heute&#8220;, &#8222;Morgen&#8220;, &#8222;Mi 17.07.&#8220;), die Y-Achse die Temperaturskala.</li>
</ol>



<p class="wp-block-paragraph"><strong>Was haben wir gelernt?</strong></p>



<ul class="wp-block-list">
<li>Wie man ein externes Paket (<code>fl_chart</code>) für komplexe UI-Elemente einbindet.</li>



<li>Wie man API-Anfragen anpasst, um mehr Daten (stündliche Werte) zu erhalten.</li>



<li>Wie man Datenmodelle und Entitäten erweitert, um neue Informationen zu speichern.</li>



<li>Wie man Rohdaten von einer API für die Darstellung in einem Diagramm aufbereitet (Mapping zu <code>ChartPoint</code> und <code>FlSpot</code>).</li>



<li>Die Grundlagen der Konfiguration eines <code>LineChart</code> mit <code>fl_chart</code>, inklusive:
<ul class="wp-block-list">
<li>Datenpunkte (<code>spots</code>)</li>



<li>Aussehen der Linie (<code>LineChartBarData</code>)</li>



<li>Achsenbeschriftung (<code>titlesData</code>, <code>SideTitleWidget</code>)</li>



<li>Gitternetz (<code>gridData</code>)</li>



<li>Interaktive Tooltips (<code>lineTouchData</code>)</li>
</ul>
</li>



<li>Wie man die UI strukturert (<code>ListView</code>), um auch größere Inhalte scrollbar zu machen.</li>



<li>Die Wichtigkeit der deutschen Locale-Initialisierung für korrekte Datumsformate.</li>
</ul>



<p class="wp-block-paragraph"><strong>Ausblick auf Teil 6:</strong></p>



<p class="wp-block-paragraph">Unsere App wird immer funktionaler und sieht auch noch besser aus! Im nächsten und vorerst letzten Teil dieser Kernserie implementieren wir unsere Spezialfunktion: die Berechnung und Anzeige der <strong>Grünlandtemperatursumme (GTS)</strong>. Dafür müssen wir historische Tagesmittelwerte von einer anderen Open-Meteo API abrufen und eine spezifische Berechnungslogik umsetzen.</p>



<p class="wp-block-paragraph">Das wird noch einmal spannend und zeigt, wie man mit Flutter auch komplexere fachliche Anforderungen umsetzen kann. Bleib dran!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Weiterführende Ressourcen &amp; Vertiefung </strong></p>



<p class="wp-block-paragraph">In diesem Teil haben wir einige neue Konzepte und Werkzeuge kennengelernt. Hier sind Links, falls du tiefer eintauchen möchtest:</p>



<ol class="wp-block-list">
<li><strong><code>fl_chart</code> Paket:</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Dokumentation &amp; Beispiele:</strong> <a href="https://flchart.dev/">https://flchart.dev/</a> &#8211; Die beste Anlaufstelle für alle Details zu <code>fl_chart</code>, inklusive einer tollen Beispiel-Galerie für verschiedene Diagrammtypen und Konfigurationen.</li>



<li><strong>Pub.dev Seite:</strong> <a href="https://pub.dev/packages/fl_chart">https://pub.dev/packages/fl_chart</a> &#8211; Für Installationsanweisungen, Versionshinweise und den Link zur API-Dokumentation.</li>



<li><strong>LineChart Beispiele (spezifisch):</strong> <a href="https://flchart.dev/docs/chart_types/line_chart">https://flchart.dev/docs/chart_types/line_chart</a> &#8211; Beispiele und Erklärungen speziell für Liniendiagramme.</li>
</ul>
</li>



<li><strong>Datenmodellierung &amp; JSON Parsing in Dart:</strong>
<ul class="wp-block-list">
<li><strong>Dart Sprach-Tour (JSON):</strong> <a href="https://dart.dev/guides/language/language-tour#json">https://dart.dev/guides/language/language-tour#json</a> &#8211; Grundlagen zum Umgang mit JSON in Dart.</li>



<li><strong>Flutter Dokumentation (JSON und Serialisierung):</strong> <a href="https://docs.flutter.dev/data-and-backend/json">https://docs.flutter.dev/data-and-backend/json</a> &#8211; Umfassender Guide, der auch automatische Code-Generierung für JSON anspricht (was wir hier manuell gemacht haben).</li>
</ul>
</li>



<li><strong>Datum &amp; Zeit Formatierung (<code>intl</code> Paket):</strong>
<ul class="wp-block-list">
<li><strong><code>intl</code> Paket auf Pub.dev:</strong> <a href="https://pub.dev/packages/intl">https://pub.dev/packages/intl</a> &#8211; Enthält die Dokumentation zur <code>DateFormat</code>-Klasse.</li>



<li><strong>Flutter Internationalization Guide:</strong> <a href="https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization">https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization</a> &#8211; Erklärt das Konzept der Lokalisierung (Locales), was wichtig ist, um z.B. deutsche Tageskürzel zu bekommen (<code>initializeDateFormatting</code>).</li>
</ul>
</li>



<li><strong>Flutter State Management (Riverpod):</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Riverpod Dokumentation:</strong> <a href="https://riverpod.dev/">https://riverpod.dev/</a> &#8211; Die beste Quelle, um Riverpod von Grund auf zu lernen oder spezifische Konzepte wie <code>StateNotifierProvider</code>, <code>ref.watch</code> und <code>ref.read</code> nachzuschlagen.</li>
</ul>
</li>



<li><strong>Flutter Layout Grundlagen (ListView, Column, SizedBox):</strong>
<ul class="wp-block-list">
<li><strong>Flutter Layout Dokumentation:</strong> <a href="https://docs.flutter.dev/ui/layout/tutorial">https://docs.flutter.dev/ui/layout/tutorial</a> &#8211; Eine gute Einführung, wie man Widgets anordnet.</li>



<li><strong>ListView Klasse:</strong> <a href="https://api.flutter.dev/flutter/widgets/ListView-class.html">https://api.flutter.dev/flutter/widgets/ListView-class.html</a> &#8211; Dokumentation zur <code>ListView</code>, die wir verwendet haben, um den Inhalt scrollbar zu machen.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-5/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">304</post-id>	</item>
		<item>
		<title>Deine Flutter Wetter-App: Schritt für Schritt – Teil 4</title>
		<link>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/</link>
					<comments>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/#comments</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Tue, 06 May 2025 17:03:09 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Wetter]]></category>
		<category><![CDATA[Wetter-App Entwicklung]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[geocoding]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=267</guid>

					<description><![CDATA[Teil 4: Mehr Orte, mehr Möglichkeiten – Adresssuche hinzufügen Hallo und willkommen zurück zu unserer Flutter-Wetter-App-Serie! Im letzten Teil haben wir einen riesigen Schritt gemacht: Wir haben die Standard-Demo-App durch unsere eigene ersetzt, eine solide Architektur aufgebaut und die aktuelle Temperatur für unseren GPS-Standort angezeigt. Dabei haben wir viel über eine saubere Architektur, State Management [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading"><strong>Teil 4: Mehr Orte, mehr Möglichkeiten – Adresssuche hinzufügen</strong></h3>



<p class="wp-block-paragraph">Hallo und willkommen zurück zu unserer Flutter-Wetter-App-Serie!</p>



<p class="wp-block-paragraph">Im <a href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-3/">letzten Teil</a> haben wir einen riesigen Schritt gemacht: Wir haben die Standard-Demo-App durch unsere eigene ersetzt, eine solide Architektur aufgebaut und die aktuelle Temperatur für unseren GPS-Standort angezeigt. Dabei haben wir viel über eine saubere Architektur, State Management mit Riverpod und Fehlerbehandlung gelernt.</p>



<p class="wp-block-paragraph">Doch eine Wetter-App ist erst richtig nützlich, wenn wir das Wetter für <em>beliebige</em> Orte nachschlagen können. Genau das packen wir heute an! Wir erweitern unsere App um eine <strong>Adresssuche</strong>.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="958" height="530" data-attachment-id="284" data-permalink="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/attachment/grafik/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/04/grafik.png" data-orig-size="958,530" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="App Teil 4" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/04/grafik.png" src="https://allround-blog.de/wp-content/uploads/2025/04/grafik.png" alt="" class="wp-image-284" srcset="https://allround-blog.de/wp-content/uploads/2025/04/grafik.png 958w, https://allround-blog.de/wp-content/uploads/2025/04/grafik-300x166.png 300w, https://allround-blog.de/wp-content/uploads/2025/04/grafik-768x425.png 768w, https://allround-blog.de/wp-content/uploads/2025/04/grafik-676x374.png 676w" sizes="(max-width: 958px) 100vw, 958px" /></figure>



<p class="wp-block-paragraph"><strong>Das Ziel für heute:</strong></p>



<ul class="wp-block-list">
<li>Wir untersuchen den Code für Teil 4 aus unserem Repository.</li>



<li>Wir verstehen, wie das <strong>Suchfeld</strong> zur Benutzeroberfläche hinzugefügt wurde.</li>



<li>Wir lernen <strong>Geocoding</strong>: Wie eine Adresse (&#8222;München&#8220;) in Koordinaten (Latitude/Longitude) umgewandelt wird.</li>



<li>Wir verfolgen, wie die <strong>App-Logik und Datenbeschaffung</strong> angepasst wurden, um Wetterdaten für gesuchte Orte abzurufen.</li>



<li>Wir sehen, wie <strong>Fehler bei der Suche</strong> (z.B. &#8222;Adresse nicht gefunden&#8220;) behandelt werden.</li>
</ul>



<p class="wp-block-paragraph"><strong>Warum dieser Schritt wichtig ist:</strong></p>



<p class="wp-block-paragraph">Dieser Teil zeigt, wie eine gut geplante Architektur Früchte trägt. Wir müssen nicht alles neu erfinden, sondern können auf unserem bestehenden Fundament aufbauen und gezielt Erweiterungen hinzufügen. Außerdem lernen wir eine weitere wichtige Funktion vieler Apps kennen: die Verarbeitung von Benutzereingaben und die Umwandlung von Text in geografische Daten.</p>



<h3 class="wp-block-heading"><strong>Schritt 1: Den Code für Teil 4 holen</strong></h3>



<p class="wp-block-paragraph">Der gesamte Code für diesen Beitrag ist wieder im Git-Repository vorbereitet.</p>



<p class="wp-block-paragraph">1. <strong>Öffne ein Terminal</strong> in deinem Projektordner (<code>flutter_weather_app_blog</code>).</p>



<p class="wp-block-paragraph">2. <strong>Stelle sicher, dass du keine lokalen Änderungen hast, die du behalten willst</strong> (ggf. <code>git stash</code>).</p>



<p class="wp-block-paragraph">3. <strong>Wechsle zum <code>main</code>-Branch</strong> (um sicher vom letzten stabilen Punkt auszugehen):</p>


<pre data-enlighter-language="bash" class="EnlighterJSRAW">
git checkout main
git pull origin main
</pre>



<p class="wp-block-paragraph">4. <strong>Checke den Code-Stand für Teil 4 aus:</strong> </p>


<pre data-enlighter-language="bash" class="EnlighterJSRAW">
git checkout part4-address-search
</pre>



<p class="wp-block-paragraph"><em>(Zur Erinnerung: Die &#8218;detached HEAD&#8216;-Meldung ist normal und bedeutet, dass du einen spezifischen Punkt in der Projekthistorie betrachtest.)</em></p>



<p class="wp-block-paragraph">5. <strong>Ganz wichtig: Abhängigkeiten holen &amp; Code generieren:</strong> Wir haben eine neue Bibliothek hinzugefügt und Code geändert, der generiert werden muss. Führe diese beiden Befehle aus:</p>


<pre data-enlighter-language="bash" class="EnlighterJSRAW">
flutter pub get
dart run build_runner build --delete-conflicting-outputs
</pre>



<p class="wp-block-paragraph">Öffne das Projekt jetzt in VS Code. Lass uns die Neuerungen erkunden!</p>



<h3 class="wp-block-heading"><strong>Schritt 2: Was ist neu? Der Überblick</strong></h3>



<p class="wp-block-paragraph">Wenn du die App jetzt startest (<code>F5</code> in VS Code), wirst du sofort die Änderungen sehen:</p>



<ul class="wp-block-list">
<li>Ein <strong>Suchfeld</strong> ist oben erschienen.</li>



<li>Ein <strong>&#8222;Mein Standort&#8220;-Button</strong> (ein kleines Fadenkreuz-Icon) befindet sich nun oben rechts in der AppBar.</li>
</ul>



<p class="wp-block-paragraph">Unter der Oberfläche sind die wesentlichen Anpassungen:</p>



<ul class="wp-block-list">
<li><strong>Neues Paket:</strong> Wir nutzen das <code>geocoding</code>-Paket.</li>



<li><strong>UI-Anpassungen:</strong> Der Hauptbildschirm (<code>WeatherScreen</code>) wurde umgebaut, um das Suchfeld und den neuen Button zu integrieren. Ein neues Widget (<code>SearchBarWidget</code>) wurde erstellt.</li>



<li><strong>Geocoding-Logik:</strong> Neue Funktionen im <code>LocationService</code> und <code>WeatherRepository</code> wandeln Adressen in Koordinaten um.</li>



<li><strong>State Management Update:</strong> Der <code>WeatherNotifier</code> kann nun Suchanfragen verarbeiten.</li>



<li><strong>Intelligentere Refresh-Funktion:</strong> Aktualisiert jetzt immer den zuletzt angezeigten Ort.</li>



<li><strong>Erweiterte Fehlerbehandlung:</strong> Erkennt und meldet Fehler bei der Adresssuche.</li>
</ul>



<h3 class="wp-block-heading"><strong>Schritt 3: Die neue Zutat – Das <code>geocoding</code>-Paket</strong></h3>



<p class="wp-block-paragraph">Wie wird aus dem Text &#8222;Hamburg&#8220; ein Paar von Koordinaten (Breitengrad, Längengrad), das unsere Wetter-API versteht? Durch <strong>Geocoding</strong>.</p>



<ul class="wp-block-list">
<li><strong><code>pubspec.yaml</code>:</strong> In dieser Datei (dem &#8222;Rezeptbuch&#8220; unserer App) haben wir eine neue Zutat hinzugefügt:</li>
</ul>


<pre data-enlighter-language="yaml" class="EnlighterJSRAW">
dependencies:
# … andere Pakete …
geocoding: ^3.0.0 # Version prüfen
</pre>



<p class="wp-block-paragraph">Dieses Paket erlaubt uns, die eingebauten Geocoding-Funktionen von Android zu verwenden. Der Befehl <code>flutter pub get</code> hat dieses Paket heruntergeladen und für unser Projekt verfügbar gemacht.</p>



<h3 class="wp-block-heading"><strong>Schritt 4: Die Benutzeroberfläche (<code>presentation</code>) – Ein Platz für die Suche</strong></h3>



<p class="wp-block-paragraph">Schauen wir uns an, wie die Benutzeroberfläche in <code>lib/src/features/weather/presentation/</code> angepasst wurde.</p>



<p class="wp-block-paragraph"><strong><code>widgets/search_bar.dart</code> (NEU):</strong></p>



<p class="wp-block-paragraph">Um den Code aufgeräumt zu halten, haben wir ein eigenes Widget für die Suchleiste erstellt. Es ist ein einfaches <code>TextField</code>, aber schön verpackt mit einem Such-Icon (<code>prefixIcon</code>), einem Senden-Icon (<code>suffixIcon</code>) und abgerundeten Ecken (<code>InputDecoration</code>).</p>



<p class="wp-block-paragraph"><strong>Wichtige Parameter:</strong></p>



<ul class="wp-block-list">
<li><code>controller</code>: Ein <code>TextEditingController</code>, um den Text im Feld zu steuern.</li>



<li><code>onSearch</code>: Eine Funktion, die aufgerufen wird, wenn der Nutzer auf das Senden-Icon tippt oder auf der Tastatur &#8222;Suchen&#8220; auswählt.</li>



<li><code>isLoading</code>: Ein <code>bool</code>, um das Feld und den Button zu deaktivieren, während die App Daten lädt.</li>
</ul>


<pre data-enlighter-language="dart" class="EnlighterJSRAW">
// lib/src/features/weather/presentation/widgets/search_bar.dart
import &#039;package:flutter/material.dart&#039;;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
class SearchBarWidget extends StatelessWidget {
final TextEditingController controller;
final Function(String) onSearch;
final bool isLoading;
final String hintText;

const SearchBarWidget({ /* … Konstruktor … */ });

@override
Widget build(BuildContext context) {
return TextField(
controller: controller,
enabled: !isLoading, // Deaktivieren bei Ladevorgang
decoration: InputDecoration(
hintText: hintText,
prefixIcon: const Icon(Icons.search),
// … weitere Styling-Details …
suffixIcon: isLoading
? /* Ladeindikator */
: IconButton(
icon: const Icon(Icons.send),
onPressed: isLoading ? null : () =&gt; onSearch(controller.text),
),
),
textInputAction: TextInputAction.search,
onSubmitted: isLoading ? null : onSearch, // Suche auch bei Enter
);
}
}
</pre>



<p class="wp-block-paragraph"><strong><code>screens/weather_screen.dart</code>:</strong> Hier passieren mehrere Dinge:</p>



<ul class="wp-block-list">
<li>C<strong>ontroller Management:</strong> Im <code>_WeatherScreenState</code> wird ein <code>TextEditingController</code> erstellt:</li>
</ul>


<pre data-enlighter-language="dart" class="EnlighterJSRAW">
final TextEditingController _searchController = TextEditingController();
</pre>



<ul class="wp-block-list">
<li><strong>Ganz wichtig:</strong> Controller speichern Ressourcen und müssen freigegeben werden, wenn das Widget zerstört wird. Das geschieht in der <code>dispose</code>-Methode:</li>
</ul>


<pre data-enlighter-language="dart" class="EnlighterJSRAW">
@override
void dispose() {
_searchController.dispose(); // Controller aufräumen!
super.dispose();
}
</pre>



<ul class="wp-block-list">
<li><strong>Layout Anpassung:</strong> Die <code>build</code>-Methode des Screens enthält jetzt eine <code>Column</code>. Das erste Kind dieser <code>Column</code> ist ein <code>Padding</code>, das unser neues <code>SearchBarWidget</code> enthält. Darunter folgen der <code>LocationHeader</code> und der <code>Expanded</code>-Bereich für den Hauptinhalt (Wetteranzeige oder Fehler).</li>
</ul>


<pre data-enlighter-language="dart" class="EnlighterJSRAW">
// lib/src/features/weather/presentation/screens/weather_screen.dart (Ausschnitt build)
@override
Widget build(BuildContext context) {
final weatherState = ref.watch(weatherNotifierProvider);
final weatherNotifier = ref.read(weatherNotifierProvider.notifier);

return Scaffold(
appBar: AppBar( /* … mit Buttons … &lt;em&gt;/ ),
body: Column( // NEU: Column für vertikale Anordnung
children: [
// Suchleiste oben
Padding(
padding: const EdgeInsets.all(12.0),
child: SearchBarWidget(
controller: _searchController,
isLoading: weatherState.status == WeatherStatus.loading,
onSearch: (query) { // Was passiert bei Suche?
if (query.trim().isNotEmpty) {
_log.info(&#039;Screen: Suche ausgelöst für &quot;$query&quot;&#039;);
FocusScope.of(context).unfocus(); // Tastatur weg
// Aktion im Notifier auslösen!
weatherNotifier.fetchWeatherForAddress(query);
} else {
_showSnackbar(&quot;Bitte einen Ort oder eine Adresse eingeben.&quot;);
}
},
),
),
// Ort anzeigen
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0),
child: LocationHeader( /&lt;/em&gt; … &lt;em&gt;/ ),
),
// Restlicher Inhalt (nimmt verfügbaren Platz ein)
Expanded(
child: RefreshIndicator( /&lt;/em&gt; … */ ),
),
],
),
);
}
</pre>



<ul class="wp-block-list">
<li><strong>Neue AppBar-Aktion:</strong> Der &#8222;Mein Standort&#8220;-Button (<code>IconButton</code> mit <code>Icons.my_location</code>) wurde zur <code>AppBar</code> hinzugefügt. Sein <code>onPressed</code> ruft einfach <code>weatherNotifier.fetchWeatherForCurrentLocation()</code>, die Methode, die wir schon aus Teil 3 kennen.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Fehlerbehandlung:</strong> Das <code>_buildErrorWidget</code> wurde angepasst. Es prüft nun zusätzlich, ob der <code>failure</code> vom Typ <code>GeocodingFailure</code> ist. Wenn ja, zeigt es eine spezifische Meldung (z.B. &#8222;Adresse &#8218;XYZ&#8216; konnte nicht gefunden werden.&#8220;) und ein passendes Icon (<code>Icons.wrong_location_outlined</code>). Da der Nutzer in diesem Fall eine neue, korrekte Suche starten muss, gibt es hier keinen &#8222;Erneut versuchen&#8220;-Button.</li>
</ul>



<h3 class="wp-block-heading"><strong>Schritt 5: Die Datenbeschaffung (<code>core</code>, <code>data</code>, <code>domain</code>) – Adresse zu Koordinaten</strong></h3>



<p class="wp-block-paragraph">Das ist das technische Herzstück der neuen Funktion. Wie kommen wir von &#8222;Paris&#8220; zu Längen- und Breitengrad?</p>



<ol class="wp-block-list">
<li><strong><code>LocationService</code> (<code>lib/src/core/location/location_service.dart</code>):</strong>
<ul class="wp-block-list">
<li>Dieser Service ist nun der Experte für <em>alle</em> Standort-bezogenen Aufgaben. Er hat die neue Methode <code>getCoordinatesFromAddress</code> bekommen.</li>



<li><strong>Wie sie funktioniert:</strong> Sie nutzt intern die Funktion <code>locationFromAddress</code> aus dem <code>geocoding</code>-Paket. Dieses Paket kommuniziert mit den nativen Diensten von Android, um die Koordinaten zu ermitteln.</li>



<li><strong>Fehlerbehandlung:</strong> Wenn das <code>geocoding</code>-Paket die Adresse nicht kennt, wirft es eine <code>NoResultFoundException</code>. Unser <code>LocationService</code> fängt diesen spezifischen Fehler und wirft stattdessen unsere eigene, definierte <code>GeocodingException</code>. Das ist wichtig, damit der Rest unserer App nicht die Interna des <code>geocoding</code>-Pakets kennen muss. Andere Fehler (z.B. Netzwerkprobleme während des Geocodings) werden ebenfalls als <code>GeocodingException</code> gefangen.</li>



<li><strong>Reverse Geocoding:</strong> Die Methode <code>getAddressFromCoordinates</code>, die wir in Teil 3 nur als Platzhalter hatten, ist jetzt <em>auch</em> implementiert. Sie nutzt <code>placemarkFromCoordinates</code> aus dem <code>geocoding</code>-Paket, um aus Koordinaten wieder eine lesbare Adresse zu machen. Das wird genutzt, um den Anzeigenamen im <code>LocationHeader</code> potenziell zu verbessern (z.B. aus Koordinaten wird &#8222;Berlin, Deutschland&#8220;).</li>
</ul>
</li>



<li><strong>Fehlerklassen (<code>lib/src/core/error/</code>)</strong>:
<ul class="wp-block-list">
<li>Wir haben <code>GeocodingException</code> (für technische Geocoding-Fehler) und <code>GeocodingFailure</code> (die abstraktere Form für unsere App-Logik) hinzugefügt.</li>
</ul>
</li>



<li><strong><code>WeatherRepository</code> (Interface &amp; Implementierung):</strong>
<ul class="wp-block-list">
<li>Das Interface (<code>domain/repositories/weather_repository.dart</code>) wurde um die Methode <code>getCoordinatesForAddress</code> erweitert – unser Repository muss diese Fähigkeit nun anbieten.</li>



<li>Die Implementierung (<code>data/repositories/weather_repository_impl.dart</code>) erfüllt diesen Vertrag:
<ul class="wp-block-list">
<li>Die <code>getCoordinatesForAddress</code>-Methode ruft <code>_locationService.getCoordinatesFromAddress</code> auf.</li>



<li>Sie fängt die <code>GeocodingException</code> vom Service.</li>



<li>Sie gibt das Ergebnis als <code>Either</code> zurück: <code>Left(GeocodingFailure(...))</code> im Fehlerfall oder <code>Right(LocationInfo(...))</code> bei Erfolg.</li>



<li><strong>Wichtig:</strong> Bei Erfolg versucht sie noch, den <code>displayName</code> des <code>LocationInfo</code>-Objekts durch einen Aufruf von <code>getLocationDisplayName</code> (also Reverse Geocoding) zu verfeinern, bevor sie das Ergebnis zurückgibt.</li>
</ul>
</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading"><strong>Schritt 6: Die Logik (<code>application</code>) – Suche und Wetter verknüpfen</strong></h3>



<p class="wp-block-paragraph">Der <code>WeatherNotifier</code> (<code>lib/src/features/weather/application/weather_notifier.dart</code>) dirigiert das Zusammenspiel.</p>



<ul class="wp-block-list">
<li><strong>Neue Methode <code>fetchWeatherForAddress</code>:</strong>
<ul class="wp-block-list">
<li>Das ist die Reaktion auf die Nutzereingabe im Suchfeld.</li>



<li>Sie prüft, ob überhaupt etwas eingegeben wurde und ob gerade schon geladen wird.</li>



<li>Sie setzt den <code>state</code> auf <code>loading</code>.</li>



<li><strong>Kernschritt 1:</strong> Sie ruft <code>_weatherRepository.getCoordinatesForAddress(address)</code> auf.</li>



<li><strong>Kernschritt 2:</strong> Sie wertet das zurückgegebene <code>Either</code> aus:
<ul class="wp-block-list">
<li>Bei <code>Left(failure)</code> (z.B. <code>GeocodingFailure</code>): Der <code>state</code> wird auf <code>failure</code> gesetzt, die UI zeigt den Fehler.</li>



<li>Bei <code>Right(locationInfo)</code> (Koordinaten erfolgreich gefunden): Jetzt kommt der Clou! Sie ruft die <strong>bereits vorhandene Methode <code>_fetchWeatherDataAndUpdateState(locationInfo)</code></strong> auf. Diese Methode weiß, wie man Wetterdaten für ein <code>LocationInfo</code>-Objekt holt – egal, ob dieses vom GPS oder vom Geocoding kam. <strong>Das ist Wiederverwendung dank guter Architektur!</strong></li>
</ul>
</li>
</ul>
</li>



<li><strong>Angepasste Methode <code>refreshWeatherData</code>:</strong>
<ul class="wp-block-list">
<li>Diese Methode wurde intelligenter. Zuvor hat sie einfach immer den GPS-Standort neu geladen.</li>



<li><strong>Jetzt:</strong> Sie schaut sich den <code>state.selectedLocation</code> an (der ja nach einer erfolgreichen Suche den gesuchten Ort enthält). Sie ruft dann <code>_fetchWeatherDataAndUpdateState</code> für genau diesen gespeicherten Ort auf. Damit funktioniert der Refresh-Button und Pull-to-Refresh immer für den Ort, den der Nutzer gerade sieht.</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><strong>Schritt 7: Der Datenfluss bei der Suche (Zusammenfassung)</strong></h3>



<p class="wp-block-paragraph">Lass uns den Weg einer Suche nachvollziehen:</p>



<ol class="wp-block-list">
<li><strong>Eingabe:</strong> Nutzer tippt &#8222;Rom&#8220; ein und drückt Senden (<code>WeatherScreen</code>).</li>



<li><strong>Aktion:</strong> <code>onSearch</code> ruft <code>notifier.fetchWeatherForAddress("Rom")</code>.</li>



<li><strong>Laden:</strong> Notifier setzt <code>state</code> auf <code>loading</code> (UI zeigt Ladekreis).</li>



<li><strong>Koordinaten holen:</strong> Notifier ruft <code>repo.getCoordinatesForAddress("Rom")</code>.</li>



<li><strong>Geocoding:</strong> Repo ruft <code>service.getCoordinatesFromAddress("Rom")</code>. Service ruft <code>geocoding</code>-Paket, bekommt Koordinaten für Rom.</li>



<li><strong>Reverse Geocoding:</strong> Repo ruft <code>service.getAddressFromCoordinates(...)</code>, bekommt vielleicht &#8222;Rom, Latium, Italien&#8220; zurück.</li>



<li><strong>Erfolg (Koordinaten):</strong> Repo gibt <code>Right(LocationInfo(..., displayName: "Rom, Latium, Italien"))</code> an Notifier zurück.</li>



<li><strong>Wetter holen:</strong> Notifier erhält <code>locationInfo_Rom</code> und ruft <code>_fetchWeatherDataAndUpdateState(locationInfo_Rom)</code>.</li>



<li><strong>API-Anfrage:</strong> Notifier ruft <code>repo.getWeatherForLocation(locationInfo_Rom)</code>. Repo ruft <code>apiService.getCurrentWeather(...)</code> mit Rom-Koordinaten.</li>



<li><strong>API-Antwort:</strong> ApiService holt Daten von Open-Meteo, parst sie.</li>



<li><strong>Erfolg (Wetter):</strong> Repo gibt <code>Right(weatherData_Rom)</code> an Notifier zurück.</li>



<li><strong>Finaler State:</strong> Notifier setzt <code>state</code> auf <code>success</code> mit <code>weatherData_Rom</code> und <code>locationInfo_Rom</code>.</li>



<li><strong>Anzeige:</strong> <code>WeatherScreen</code> wird neu gebaut und zeigt &#8222;Rom, Latium, Italien&#8220; und die aktuelle Temperatur für Rom an.</li>
</ol>



<h3 class="wp-block-heading"><strong>Schritt 8: Ausführen und Experimentieren!</strong></h3>



<p class="wp-block-paragraph">Starte die App (<code>F5</code>) und spiele damit herum:</p>



<ul class="wp-block-list">
<li>Suche verschiedene Städte, Länder, Sehenswürdigkeiten.</li>



<li>Suche nach ungültigen Adressen.</li>



<li>Wechsle zwischen Suchergebnissen und deinem GPS-Standort über den &#8222;Mein Standort&#8220;-Button.</li>



<li>Teste die Refresh-Funktion für gesuchte Orte.</li>



<li>Beobachte die Log-Ausgaben in der &#8222;DEBUG CONSOLE&#8220; in VS Code, um den Fluss nachzuvollziehen.</li>
</ul>



<p class="wp-block-paragraph"><strong>Fazit und Ausblick</strong></p>



<p class="wp-block-paragraph">Wir haben unserer App eine wichtige Funktion hinzugefügt und dabei gesehen, wie unsere Architektur uns geholfen hat, Code wiederzuverwenden und die Änderungen sauber zu integrieren. Du hast gelernt:</p>



<ul class="wp-block-list">
<li>Wie man eine neue Bibliothek (<code>geocoding</code>) einbindet und nutzt.</li>



<li>Wie der Prozess von der Adresseingabe bis zur Koordinate funktioniert (Geocoding).</li>



<li>Wie man die App-Logik im Notifier erweitert, um neue Benutzeraktionen zu behandeln.</li>



<li>Wie man bestehende Komponenten (wie die Wetterabfrage) für neue Szenarien wiederverwendet.</li>



<li>Wie man die Refresh-Logik an den aktuellen App-Zustand anpasst.</li>
</ul>



<p class="wp-block-paragraph">Unsere App ist jetzt deutlich flexibler. Aber reine Zahlen und Texte sind oft nicht genug, um Wettertrends zu erfassen. Im <strong>nächsten Teil (Teil 5)</strong> wird es grafisch: Wir holen uns <strong>stündliche Temperaturdaten</strong> von der API und visualisieren den <strong>Verlauf der letzten 7 Tage und die Prognose für die nächsten 7 Tage</strong> in einem interaktiven <strong>Liniendiagramm</strong>!</p>



<p class="wp-block-paragraph">Das wird die App optisch aufwerten und noch informativer machen. Bleib neugierig!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Weiterführende Ressourcen &amp; Vertiefung (für Teil 4)</strong></p>



<p class="wp-block-paragraph">In diesem Teil haben wir die App interaktiver gemacht und Geocoding eingeführt.</p>



<ol class="wp-block-list">
<li><strong>Geocoding:</strong>
<ul class="wp-block-list">
<li><strong><code>geocoding</code> Paket:</strong> <a href="https://pub.dev/packages/geocoding">https://pub.dev/packages/geocoding</a> &#8211; Die Dokumentation zum verwendeten Paket.</li>



<li><strong>Konzept Geocoding/Reverse Geocoding (Allgemein):</strong> Suche online nach diesen Begriffen, um das grundlegende Konzept besser zu verstehen (z.B. auf Wikipedia oder GIS-Seiten).</li>
</ul>
</li>



<li><strong>Flutter UI &#8211; Eingabefelder:</strong>
<ul class="wp-block-list">
<li><strong><code>TextField</code> Widget:</strong> <a href="https://api.flutter.dev/flutter/material/TextField-class.html">https://api.flutter.dev/flutter/material/TextField-class.html</a> &#8211; Die offizielle API-Dokumentation für das Text-Eingabefeld.</li>



<li><strong><code>TextEditingController</code>:</strong> <a href="https://api.flutter.dev/flutter/widgets/TextEditingController-class.html">https://api.flutter.dev/flutter/widgets/TextEditingController-class.html</a> &#8211; Wichtig zur Steuerung des Textes in einem <code>TextField</code>. Denke an <code>dispose()</code>!</li>



<li><strong>Formulareingaben verarbeiten (Flutter Kochbuch):</strong> <a href="https://docs.flutter.dev/cookbook/forms/retrieve-input">https://docs.flutter.dev/cookbook/forms/retrieve-input</a> &#8211; Zeigt verschiedene Wege, auf Benutzereingaben zu reagieren.</li>



<li><strong>Fokus Management (<code>FocusScope</code>):</strong> <a href="https://api.flutter.dev/flutter/widgets/FocusScope-class.html">https://api.flutter.dev/flutter/widgets/FocusScope-class.html</a> &#8211; Nützlich, um z.B. die Tastatur nach der Eingabe zu schließen.</li>
</ul>
</li>



<li><strong>Architektur &amp; Refactoring:</strong>
<ul class="wp-block-list">
<li><em>(Die Links aus Teil 3 zur Architektur sind weiterhin relevant)</em> &#8211; Betrachte, wie die bestehende Struktur das Hinzufügen der Suchfunktion erleichtert hat, ohne große Umbauten an der Wetterabfrage selbst vornehmen zu müssen.</li>
</ul>
</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">267</post-id>	</item>
		<item>
		<title>Deine Flutter Wetter-App: Schritt für Schritt – Teil 3</title>
		<link>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-3/</link>
					<comments>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-3/#comments</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Mon, 21 Apr 2025 11:31:18 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Wetter]]></category>
		<category><![CDATA[Wetter-App Entwicklung]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Flutter]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=228</guid>

					<description><![CDATA[Teil 3: Der erste Meilenstein: Aktuelle Temperatur am aktuellen Ort – Den Code verstehen Hallo und willkommen zurück zur Serie! In Teil 2 haben wir unsere Werkzeuge geschärft und die Flutter-Entwicklungsumgebung auf deinem Windows-PC eingerichtet. Wir haben sogar die Standard-Flutter-App zum Laufen gebracht. Super! Heute tauchen wir endlich in den eigentlichen Code unserer Wetter-App ein. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Teil 3: Der erste Meilenstein: Aktuelle Temperatur am aktuellen Ort – Den Code verstehen</strong></p>



<p class="wp-block-paragraph">Hallo und willkommen zurück zur Serie!</p>



<p class="wp-block-paragraph">In <a href="link-zu-teil-2.html">Teil 2</a> haben wir unsere Werkzeuge geschärft und die Flutter-Entwicklungsumgebung auf deinem Windows-PC eingerichtet. Wir haben sogar die Standard-Flutter-App zum Laufen gebracht. Super!</p>



<p class="wp-block-paragraph">Heute tauchen wir endlich in den <em>eigentlichen</em> Code unserer Wetter-App ein. Wir überspringen das manuelle Tippen jedes Zeichens und konzentrieren uns stattdessen darauf, den Code für unseren <strong>ersten Meilenstein</strong> zu verstehen: <strong>Die App soll die aktuelle Temperatur für deinen aktuellen GPS-Standort anzeigen.</strong></p>



<p class="wp-block-paragraph"><strong>Das Ziel für heute:</strong></p>



<ul class="wp-block-list">
<li>Wir schauen uns den vorbereiteten Code für Teil 3 an (den du aus einem Repository herunterladen kannst).</li>



<li>Wir zerlegen die <strong>Projektstruktur</strong> und verstehen, welche Datei wo hingehört und warum.</li>



<li>Wir verfolgen den <strong>Datenfluss</strong>: Wie kommt die Temperatur vom Internet auf deinen Bildschirm?</li>



<li>Wir beleuchten die <strong>wichtigsten Konzepte</strong>: Architektur, State Management mit Riverpod, Fehlerbehandlung und mehr.</li>
</ul>



<p class="wp-block-paragraph"><strong>Warum dieser Ansatz?</strong></p>



<p class="wp-block-paragraph">Eine App zu bauen ist wie ein Haus zu bauen. Man könnte einfach loslegen, aber ein guter Architekt plant zuerst. Wir haben den Code für diesen ersten Schritt bereits nach einem bewährten Plan (einer &#8222;sauberen Architektur&#8220;) strukturiert. Indem wir diesen fertigen, aber einfachen Code untersuchen, lernst du nicht nur, <em>wie</em> man eine Funktion implementiert, sondern auch, <em>wie man Code organisiert</em>, damit er später leicht erweitert, getestet und gewartet werden kann. Das ist entscheidend, um selbst gute Apps zu schreiben!</p>



<p class="wp-block-paragraph"><strong>Schritt 1: Den Code holen</strong></p>



<p class="wp-block-paragraph">Der gesamte Code für diesen Teil der Serie ist in einem Git-Repository vorbereitet.</p>



<ol class="wp-block-list">
<li><strong>Repository klonen (falls noch nicht geschehen):</strong><br>Öffne eine Eingabeaufforderung oder ein Terminal und navigiere zu dem Ordner, in dem du deine Projekte speichern möchtest (z.B. <code>C:\dev\flutter_projekte\</code>). Führe dann folgenden Befehl aus:<br><code>git clone https://github.com/hschewe/flutter_weather_app_blog.git</code><br>Wechsle in das neu erstellte Verzeichnis:<br><code>bash cd flutter_weather_app_blog</code></li>



<li><strong>Den richtigen Stand auschecken:</strong> Für jeden Teil der Serie gibt es einen Git-Tag. Um den Code-Stand für Teil 3 zu bekommen, führe aus:<br><code>git checkout part3-current-temp-gps</code>.<br>(Git meldet möglicherweise, dass du dich in einem &#8218;detached HEAD&#8216;-Zustand befindest. Das ist normal und bedeutet, du schaust dir einen spezifischen Punkt in der Vergangenheit an. Du kannst den den Code untersuchen, ausführen und sogar temporäre Änderungen vornehmen. Wenn du zur normalen Entwicklung zurückkehren willst, kannst du einfach wieder den main-Branch auschecken (<code>git checkout main</code>)).</li>



<li><strong>Projekt in VS Code öffnen:</strong> Öffne VS Code und wähle <code>File &gt; Open Folder...</code> und navigiere zum <code>flutter_weather_app_blog</code>-Ordner.</li>



<li><strong>Abhängigkeiten installieren:</strong> Öffne ein Terminal in VS Code (<code>Terminal &gt; New Terminal</code>) und führe aus:<br><code>flutter pub get</code></li>



<li><strong>Code generieren:</strong> Da wir Riverpod mit Code-Generierung verwenden, müssen wir diesen Schritt ausführen:<br><code>dart run build_runner build --delete-conflicting-outputs</code><br>Dieser Befehl liest spezielle Anmerkungen (<code>@riverpod</code>) im Code und erstellt automatisch benötigte Hilfsdateien (die auf <code>.g.dart</code> enden).</li>
</ol>



<p class="wp-block-paragraph">Jetzt ist der Code bereit zur Untersuchung!</p>



<p class="wp-block-paragraph"><strong>Schritt 2: Der große Überblick – Die Architektur</strong></p>



<p class="wp-block-paragraph">Bevor wir in einzelne Dateien schauen, betrachten wir den Bauplan. Unsere App folgt einer <strong>Schichtenarchitektur</strong>, inspiriert von &#8222;Clean Architecture&#8220;. Stell dir vor, wir bauen Schichten wie bei einer Zwiebel:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">+-------------------------------------------------+
| Presentation (UI) Layer                         | &lt;--- Das, was der Nutzer sieht (Widgets, Screens)
|    - Widgets                                    |      Interagiert mit dem Application Layer
|    - Screens                                    |
|    - State Management (Notifier/Provider)       |
+-------------------------------------------------+
      ^                                      | Dependency Rule
      | Calls                                | (Innere Schichten kennen Äußere nicht)
+-------------------------------------------------+
| Application / Domain Layer                      | &lt;--- Die Logik der App
|    - State Notifier (Logik-Orchestrierung)      |      Definiert, WAS die App tut
|    - Repository Interface (Datenvertrag)        |      Kennt nur Entities
|    - Entities (App-Datenstrukturen)             |
+-------------------------------------------------+
      ^                                      |
      | Implements / Calls                   |
+-------------------------------------------------+
| Data Layer                                      | &lt;--- Datenbeschaffung &amp; -speicherung
|    - Repository Implementation                  |      Implementiert den Vertrag
|    - Data Sources (API, GPS, DB)                |      Spricht mit der Außenwelt
|    - Models (API/DB-Datenstrukturen)            |
+-------------------------------------------------+
      ^ Depends on                             ^ Depends on
      |                                        |
+-------------------------------------------------+
| Core Layer                                      | &lt;--- App-übergreifende Helfer
|    - Utils (Logger, Formatter)                  |      Von allen Schichten nutzbar
|    - Error Handling                             |
|    - Networking Client                          |
+-------------------------------------------------+</pre>



<ul class="wp-block-list">
<li><strong>Core:</strong> Enthält grundlegende Helferlein, die überall gebraucht werden könnten (wie unser Logger).</li>



<li><strong>Data:</strong> Kümmert sich darum, <em>woher</em> die Daten kommen (API, GPS) und <em>wie</em> sie technisch abgefragt werden. Kennt die genaue Struktur der externen Daten.</li>



<li><strong>Domain/Application:</strong> Das Herzstück. Definiert, <em>welche</em> Daten die App braucht (<code>Entities</code>) und <em>welche</em> Operationen möglich sind (<code>Repository Interface</code>), aber nicht, wie sie beschafft werden. Hier sitzt auch die Logik, die auf Nutzeraktionen reagiert (<code>Notifier</code>). Diese Schicht sollte unabhängig von UI-Details oder spezifischen Datenbanken/APIs sein.</li>



<li><strong>Presentation (UI):</strong> Zeigt die Daten an (<code>Screens</code>, <code>Widgets</code>) und nimmt Nutzereingaben entgegen. Sie spricht nur mit dem Application Layer (über den Notifier), um Daten zu bekommen oder Aktionen auszulösen.</li>
</ul>



<p class="wp-block-paragraph"><strong>Die goldene Regel:</strong> Abhängigkeiten zeigen immer nach innen! Die UI kennt die Application/Domain Layer, aber nicht die Data Layer. Die Domain Layer kennt niemanden außerhalb (außer Core). Das macht das System flexibel und testbar.</p>



<p class="wp-block-paragraph"><strong>Schritt 3: Ein Rundgang durch die Ordner (<code>lib/src/</code>)</strong></p>



<p class="wp-block-paragraph">Schauen wir uns an, wie diese Architektur in unserer Ordnerstruktur abgebildet ist:</p>



<ul class="wp-block-list">
<li><strong><code>lib/main.dart</code>:</strong> Der allererste Startpunkt. Initialisiert das Logging, <code>WidgetsFlutterBinding</code> (wichtig für Plugins) und startet die App innerhalb einer <code>ProviderScope</code> (notwendig für Riverpod).</li>



<li><strong><code>lib/app.dart</code>:</strong> Enthält das <code>MaterialApp</code>-Widget, das die grundlegende Struktur, das Theme (Aussehen) und die Startseite (<code>WeatherScreen</code>) unserer App definiert.</li>



<li><strong><code>lib/src/core/</code>:</strong> Unser Fundament.
<ul class="wp-block-list">
<li><strong><code>error/</code>:</strong> Enthält <code>exceptions.dart</code> (spezifische technische Fehler wie <code>NetworkException</code>) und <code>failure.dart</code> (abstraktere Fehler wie <code>NetworkFailure</code>, die die Logik verstehen kann). Diese Trennung hilft, Fehler sauber zu behandeln.</li>



<li><strong><code>location/</code>:</strong> <code>location_service.dart</code> kapselt die Interaktion mit dem <code>geolocator</code>-Paket. Alle GPS- und Berechtigungs-Anfragen laufen hierüber. Wird über Riverpod bereitgestellt (<code>locationServiceProvider</code>).</li>



<li><strong><code>networking/</code>:</strong> <code>http_client.dart</code> stellt eine globale Instanz des <code>http.Client</code> bereit (über <code>httpClientProvider</code>). Das macht es einfach, ihn in Tests durch einen Mock zu ersetzen.</li>



<li><strong><code>utils/</code>:</strong> Enthält Helfer wie <code>logger.dart</code> (für strukturierte Logs) und <code>date_formatter.dart</code> (um z.B. die Uhrzeit anzuzeigen).</li>



<li><strong><code>constants/</code>:</strong> <code>app_constants.dart</code> sammelt zentrale Konstanten (hier erstmal nur <code>myLocationLabel</code>).</li>
</ul>
</li>



<li><strong><code>lib/src/features/weather/</code>:</strong> Alles, was mit der Wetterfunktion zu tun hat.
<ul class="wp-block-list">
<li><strong><code>data/</code>:</strong> Datenbeschaffung.
<ul class="wp-block-list">
<li><strong><code>models/</code>:</strong> <code>current_weather_model.dart</code>, <code>forecast_response_model.dart</code>. Diese Dart-Klassen spiegeln <em>exakt</em> die Struktur des JSON wider, das wir von der Open-Meteo API bekommen. Sie enthalten <code>fromJson</code>-Methoden, um JSON in Dart-Objekte umzuwandeln.</li>



<li><strong><code>datasources/</code>:</strong> <code>weather_api_service.dart</code>. Spricht über den <code>http.Client</code> mit der Open-Meteo API (<code>getCurrentWeather</code>-Methode). Parst die JSON-Antwort mithilfe der <code>Models</code> und wirft spezifische <code>Exceptions</code> (<code>ApiException</code>, <code>NetworkException</code>, <code>DataParsingException</code>). Wird über Riverpod bereitgestellt (<code>weatherApiServiceProvider</code>).</li>



<li><strong><code>repositories/</code>:</strong> <code>weather_repository_impl.dart</code>. Die <em>konkrete</em> Implementierung unseres Datenvertrags. Diese Klasse kennt den <code>WeatherApiService</code> und den <code>LocationService</code>. Sie ruft deren Methoden auf, fängt deren <code>Exceptions</code> ab und wandelt sie in <code>Failures</code> um (z.B. wird <code>NetworkException</code> zu <code>NetworkFailure</code>). Sie wandelt auch die API-<code>Models</code> in die App-internen <code>Entities</code> um. Wird über Riverpod bereitgestellt (<code>weatherRepositoryProvider</code>).</li>
</ul>
</li>



<li><strong><code>domain/</code>:</strong> Das Kernstück der App-Logik.
<ul class="wp-block-list">
<li><strong><code>entities/</code>:</strong> <code>location_info.dart</code>, <code>current_weather_data.dart</code>. Einfache Dart-Klassen, die die Daten repräsentieren, <em>wie sie die App intern benötigt</em>, unabhängig von der API. Nutzen <code>Equatable</code> für einfache Vergleiche.</li>



<li><strong><code>repositories/</code>:</strong> <code>weather_repository.dart</code>. Das ist nur ein &#8222;Interface&#8220; (abstrakte Klasse). Es definiert, <em>was</em> man mit Wetterdaten tun können muss (z.B. <code>getWeatherForLocation</code>, <code>getCurrentLocationCoordinates</code>), aber nicht <em>wie</em>. Das ist der Vertrag, den die <code>WeatherRepositoryImpl</code> erfüllen muss.</li>
</ul>
</li>



<li><strong><code>application/</code>:</strong> Die Orchestrierung.
<ul class="wp-block-list">
<li><strong><code>weather_state.dart</code>:</strong> Definiert, wie der Zustand des Wetter-Features aussieht: ein <code>enum WeatherStatus</code> (initial, loading, success, failure), die eigentlichen <code>CurrentWeatherData</code>, der <code>selectedLocation</code> und ein optionales <code>Failure</code>-Objekt. Nutzt <code>Equatable</code> und <code>copyWith</code>.</li>



<li><strong><code>weather_notifier.dart</code>:</strong> Die Steuerzentrale. Ein <code>StateNotifier</code>, der den <code>WeatherState</code> hält und aktualisiert. Er bekommt das <code>WeatherRepository</code> übergeben (Dependency Injection durch Riverpod). Enthält die Logik für <code>fetchWeatherForCurrentLocation</code> und <code>refreshWeatherData</code>. Er ruft Methoden im Repository auf, behandelt das <code>Either&lt;Failure, Success&gt;</code>-Ergebnis und aktualisiert den <code>state</code> entsprechend.</li>
</ul>
</li>



<li><strong><code>presentation/</code>:</strong> Die Benutzeroberfläche.
<ul class="wp-block-list">
<li><strong><code>providers/</code>:</strong> <code>weather_providers.dart</code>. Definiert den <code>weatherNotifierProvider</code>, der den <code>WeatherNotifier</code> erstellt und der UI zur Verfügung stellt.</li>



<li><strong><code>widgets/</code>:</strong> Kleine, wiederverwendbare UI-Teile. <code>location_header.dart</code> zeigt den Ortsnamen, <code>current_temperature_display.dart</code> zeigt die Temperatur und Zeit. Sie bekommen ihre Daten von außen übergeben.</li>



<li><strong><code>screens/</code>:</strong> <code>weather_screen.dart</code>. Der Hauptbildschirm. Ein <code>ConsumerStatefulWidget</code>, das über <code>ref.watch(weatherNotifierProvider)</code> den aktuellen <code>WeatherState</code> bekommt. Basierend auf dem <code>status</code> im State, zeigt es entweder einen Ladeindikator, die Wetter-Widgets oder eine Fehlermeldung (<code>_buildErrorWidget</code>). Es nutzt <code>ref.read(weatherNotifierProvider.notifier)</code> um Aktionen im Notifier auszulösen (initiales Laden, Refresh). Der <code>RefreshIndicator</code> ermöglicht Pull-to-Refresh. Der <code>AnimatedSwitcher</code> sorgt für weiche Übergänge.</li>
</ul>
</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 4: Den Datenfluss verstehen</strong></p>



<p class="wp-block-paragraph">Wie hängt das alles zusammen, wenn die App startet?</p>



<ol class="wp-block-list">
<li><strong>Start (<code>main.dart</code> -&gt; <code>app.dart</code> -&gt; <code>WeatherScreen</code>)</strong>: Die App wird initialisiert, <code>ProviderScope</code> wird erstellt. <code>WeatherScreen</code> wird angezeigt.</li>



<li><strong>Initial Load (<code>WeatherScreen.initState</code>)</strong>: Der Screen merkt, dass er neu ist (<code>initialState.status == WeatherStatus.initial</code>) und triggert über <code>ref.read(weatherNotifierProvider.notifier).fetchWeatherForCurrentLocation()</code> den Ladevorgang im Notifier.</li>



<li><strong>Loading State (<code>WeatherNotifier</code>)</strong>: Der Notifier setzt sofort seinen <code>state</code> auf <code>status: WeatherStatus.loading</code>.</li>



<li><strong>UI Reaction (<code>WeatherScreen</code>)</strong>: Da der Screen via <code>ref.watch</code> auf den State hört, wird er neu gebaut und zeigt jetzt (im <code>_buildContent</code>) einen Ladeindikator an.</li>



<li><strong>Get Coordinates (<code>WeatherNotifier</code> -&gt; <code>WeatherRepository</code> -&gt; <code>LocationService</code>)</strong>:
<ul class="wp-block-list">
<li>Notifier ruft <code>_weatherRepository.getCurrentLocationCoordinates()</code> auf.</li>



<li>Das Repo (<code>WeatherRepositoryImpl</code>) ruft <code>_locationService.getCurrentPosition()</code> auf.</li>



<li>Der <code>LocationService</code> interagiert mit dem <code>geolocator</code>, fragt ggf. nach Berechtigungen und holt die <code>Position</code>.</li>



<li>Wenn erfolgreich, gibt der Service die <code>Position</code> zurück. Wenn ein Fehler auftritt (z.B. Berechtigung verweigert), wirft er eine <code>LocationException</code>.</li>



<li>Das Repo fängt die <code>Exception</code>, wandelt sie ggf. in eine <code>Failure</code> (<code>PermissionFailure</code>, <code>LocationFailure</code>) um und gibt <code>Left(failure)</code> zurück. Bei Erfolg erstellt es <code>LocationInfo</code> und gibt <code>Right(locationInfo)</code> zurück.</li>
</ul>
</li>



<li><strong>Handle Coordinates Result (<code>WeatherNotifier</code>)</strong>:
<ul class="wp-block-list">
<li>Der Notifier erhält das <code>Either</code>. Bei <code>Left(failure)</code> setzt er den <code>state</code> auf <code>status: WeatherStatus.failure</code> mit dem <code>failure</code>-Objekt -&gt; Die UI zeigt die Fehlermeldung.</li>



<li>Bei <code>Right(locationInfo)</code> geht es weiter. Der Notifier versucht noch, den Namen via <code>_weatherRepository.getLocationDisplayName</code> zu holen (was in Teil 3 noch nicht viel tut) und ruft dann <code>_fetchWeatherDataAndUpdateState(finalLocationInfo)</code> auf.</li>
</ul>
</li>



<li><strong>Get Weather Data (<code>WeatherNotifier</code> -&gt; <code>WeatherRepository</code> -&gt; <code>WeatherApiService</code>)</strong>:
<ul class="wp-block-list">
<li>Notifier ruft <code>_weatherRepository.getWeatherForLocation(locationInfo)</code> auf.</li>



<li>Das Repo (<code>WeatherRepositoryImpl</code>) ruft <code>_apiService.getCurrentWeather(...)</code> auf.</li>



<li>Der <code>WeatherApiService</code> baut die URL, macht den <code>http.get</code>-Aufruf, parst das JSON in <code>ForecastResponseModel</code>, extrahiert <code>CurrentWeatherModel</code>. Bei Fehlern (Netzwerk, API-Status, Parsing) wirft er <code>NetworkException</code>, <code>ApiException</code>, <code>DataParsingException</code>.</li>



<li>Das Repo fängt diese <code>Exceptions</code>, wandelt sie in <code>Failures</code> (<code>NetworkFailure</code>, <code>ServerFailure</code>) um und gibt <code>Left(failure)</code> zurück. Bei Erfolg wandelt es <code>CurrentWeatherModel</code> in <code>CurrentWeatherData</code> (unser App-Entity) um und gibt <code>Right(weatherData)</code> zurück.</li>
</ul>
</li>



<li><strong>Handle Weather Result (<code>WeatherNotifier</code>)</strong>:
<ul class="wp-block-list">
<li>Der Notifier erhält das <code>Either</code>. Bei <code>Left(failure)</code> setzt er den <code>state</code> auf <code>status: WeatherStatus.failure</code> mit dem <code>failure</code>-Objekt -&gt; Die UI zeigt die Fehlermeldung.</li>



<li>Bei <code>Right(weatherData)</code> setzt er den <code>state</code> auf <code>status: WeatherStatus.success</code>, speichert <code>weatherData</code> und <code>locationInfo</code> im State und löscht den Fehler (<code>clearError: true</code>).</li>
</ul>
</li>



<li><strong>UI Reaction (<code>WeatherScreen</code>)</strong>: Der Screen hört wieder auf die State-Änderung (<code>ref.watch</code>). Er wird neu gebaut, <code>_buildContent</code> erkennt <code>WeatherStatus.success</code> und zeigt jetzt <code>LocationHeader</code> und <code>CurrentTemperatureDisplay</code> mit den Daten aus dem <code>state</code> an.</li>
</ol>



<p class="wp-block-paragraph"><strong>Schritt 5: Schlüsselkonzepte im Code</strong></p>



<ul class="wp-block-list">
<li><strong>Riverpod für State Management &amp; Dependency Injection:</strong>
<ul class="wp-block-list">
<li><code>ProviderScope</code> (in <code>main.dart</code>): Macht Provider global verfügbar.</li>



<li><code>@riverpod</code> / <code>...Provider</code> (z.B. in <code>location_service.dart</code>, <code>weather_repository_impl.dart</code>): Definiert, <em>wie</em> eine Instanz eines Service oder Repositories erstellt wird. Riverpod kümmert sich darum, dass nur eine Instanz erstellt und wiederverwendet wird. Das ist <strong>Dependency Injection</strong>: Komponenten bekommen ihre Abhängigkeiten (wie den <code>http.Client</code> oder den <code>LocationService</code>) &#8222;injiziert&#8220;, statt sie selbst zu erstellen.</li>



<li><code>StateNotifierProvider</code> (<code>weather_providers.dart</code>): Ein spezieller Provider für unseren <code>WeatherNotifier</code>, der dessen Zustand (<code>WeatherState</code>) verwaltet.</li>



<li><code>ConsumerWidget</code> / <code>ConsumerStatefulWidget</code> (<code>WeatherScreen</code>): Widgets, die auf Provider &#8222;hören&#8220; können.</li>



<li><code>ref.watch()</code> (im <code>build</code> von <code>WeatherScreen</code>): Liest den Wert eines Providers und <strong>baut das Widget neu</strong>, wenn sich der Wert (hier der <code>WeatherState</code>) ändert.</li>



<li><code>ref.read()</code> (im <code>initState</code> oder in Callbacks wie <code>onPressed</code> von <code>WeatherScreen</code>): Liest den Wert eines Providers <em>einmalig</em>, ohne auf Änderungen zu hören. Wird verwendet, um Methoden im Notifier aufzurufen.</li>
</ul>
</li>



<li><strong>Fehlerbehandlung (<code>Either</code>, <code>Failure</code>, <code>Exception</code>):</strong>
<ul class="wp-block-list">
<li>Services (<code>LocationService</code>, <code>WeatherApiService</code>) werfen spezifische <code>Exceptions</code> bei technischen Problemen.</li>



<li>Das Repository (<code>WeatherRepositoryImpl</code>) fängt diese <code>Exceptions</code> und wandelt sie in allgemeinere <code>Failures</code> um. Es gibt das Ergebnis als <code>Either&lt;Failure, Success&gt;</code> zurück – ein klarer Weg, um Erfolg oder Misserfolg zu signalisieren, ohne Exceptions durch die ganze App zu werfen.</li>



<li>Der Notifier (<code>WeatherNotifier</code>) behandelt das <code>Either</code>-Ergebnis und aktualisiert den <code>WeatherState</code> entsprechend (<code>status: WeatherStatus.failure</code> oder <code>success</code>).</li>



<li>Die UI (<code>WeatherScreen</code>) reagiert auf den <code>status</code> und das <code>error</code>-Feld im State und zeigt die passende Ansicht.</li>
</ul>
</li>



<li><strong>Asynchronität (<code>Future</code>, <code>async</code>, <code>await</code>):</strong> Netzwerk- und GPS-Anfragen dauern eine Weile. <code>Future</code> repräsentiert einen Wert, der <em>irgendwann</em> verfügbar sein wird. <code>async</code> markiert eine Funktion, die <code>await</code> verwenden kann. <code>await</code> pausiert die Ausführung der Funktion, bis der <code>Future</code> abgeschlossen ist, ohne die gesamte App zu blockieren. Wir sehen das intensiv im Notifier, Repository und den Services.</li>



<li><strong>Immutability &amp; Equatable:</strong> Der <code>WeatherState</code> wird nie direkt geändert. Stattdessen wird mit <code>copyWith</code> eine <em>neue</em> Instanz mit den geänderten Werten erstellt. Das macht den Zustandsfluss vorhersagbar. <code>Equatable</code> hilft Riverpod (und uns beim Testen), effizient zu erkennen, ob sich der Zustand <em>wirklich</em> geändert hat, indem es Objekte anhand ihrer Eigenschaften vergleicht, nicht nur anhand ihrer Speicheradresse.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="552" height="929" data-attachment-id="233" data-permalink="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-3/attachment/clipboard01/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard01.jpg" data-orig-size="552,929" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="App Teil 3" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard01.jpg" src="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard01.jpg" alt="" class="wp-image-233" srcset="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard01.jpg 552w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard01-178x300.jpg 178w" sizes="(max-width: 552px) 100vw, 552px" /></figure>



<p class="wp-block-paragraph"><strong>Schritt 6: Ausführen und Experimentieren!</strong></p>



<p class="wp-block-paragraph">Jetzt, wo du eine Vorstellung davon hast, wie der Code aufgebaut ist und funktioniert:</p>



<ol class="wp-block-list">
<li><strong>Starte die App:</strong> Wähle dein Gerät in VS Code und drücke <code>F5</code>.</li>



<li><strong>Beobachte:</strong> Verfolge die Log-Ausgaben im &#8222;DEBUG CONSOLE&#8220;-Fenster von VS Code. Du solltest die Meldungen von <code>AppLogger</code> aus den verschiedenen Schichten sehen.</li>



<li><strong>Experimentiere:</strong>
<ul class="wp-block-list">
<li>Ändere Texte in den Widgets.</li>



<li>Setze Haltepunkte (Breakpoints) in VS Code (klicke links neben die Zeilennummer) in verschiedenen Methoden (z.B. im Notifier, im Repo, im Service) und starte die App im Debug-Modus (<code>F5</code>). Steppe durch den Code (<code>F10</code>, <code>F11</code>), um den Fluss live zu sehen.</li>



<li>Simuliere Fehler: Wirf testweise eine Exception im <code>WeatherApiService</code> oder gib <code>Left(NetworkFailure())</code> im Repository zurück, um zu sehen, wie die Fehlerbehandlung in der UI greift.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"><strong>Zusammenfassung und Nächste Schritte</strong></p>



<p class="wp-block-paragraph">Das war ein tiefer Einblick in den Code unseres ersten Meilensteins! Du hast gesehen, wie wir mit einer klaren Architektur und Werkzeugen wie Riverpod eine skalierbare und testbare Grundlage geschaffen haben, auch für eine zunächst einfache Funktion. Du verstehst jetzt (hoffentlich!) besser:</p>



<ul class="wp-block-list">
<li>Die Aufteilung in Schichten (Presentation, Domain/Application, Data, Core).</li>



<li>Die Verantwortlichkeiten der einzelnen Komponenten (Widgets, Notifier, Repositories, Services).</li>



<li>Den Daten- und Kontrollfluss durch die App.</li>



<li>Die Grundprinzipien von State Management, Fehlerbehandlung und Asynchronität in Flutter.</li>
</ul>



<p class="wp-block-paragraph">Im <strong>nächsten Teil (Teil 4)</strong> bauen wir darauf auf und machen die App interaktiver: Wir fügen die <strong>Adresssuche</strong> hinzu!</p>



<p class="wp-block-paragraph">Bleib dran und viel Spaß beim Erkunden des Codes!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Weiterführende Ressourcen &amp; Vertiefung (für Teil 3)</strong></p>



<p class="wp-block-paragraph">Dieser Teil hat viele grundlegende Konzepte der Flutter-Entwicklung eingeführt. Hier sind Links zum Vertiefen:</p>



<ol class="wp-block-list">
<li><strong>Projektstruktur &amp; Architektur:</strong>
<ul class="wp-block-list">
<li><strong>Flutter App architecture samples (GitHub):</strong> <a href="https://github.com/flutter/samples/tree/main/experimental/context_menus">https://github.com/flutter/samples/tree/main/experimental/context_menus</a> (Beispielhaft, es gibt viele Ansätze) &#8211; Oft komplex, aber gibt Ideen. Unsere Struktur ist eine vereinfachte Form, die oft als &#8222;Feature-First&#8220; mit Schichtentrennung bezeichnet wird.</li>



<li><strong>Clean Architecture in Flutter (Artikel/Videos):</strong> Suche nach &#8222;Clean Architecture Flutter&#8220; für verschiedene Interpretationen und Erklärungen (z.B. von Reso Coder, Vandad Nahavandipoor).</li>
</ul>
</li>



<li><strong>Flutter Pakete (Dependencies):</strong>
<ul class="wp-block-list">
<li><strong>Pakete verwenden (Offizielle Doku):</strong> <a href="https://docs.flutter.dev/packages-and-plugins/using-packages">https://docs.flutter.dev/packages-and-plugins/using-packages</a> &#8211; Wie man Pakete in <code>pubspec.yaml</code> hinzufügt und nutzt.</li>



<li><strong><code>http</code> Paket:</strong> <a href="https://pub.dev/packages/http">https://pub.dev/packages/http</a> &#8211; Für Netzwerk-Anfragen.</li>



<li><strong><code>geolocator</code> Paket:</strong> <a href="https://pub.dev/packages/geolocator">https://pub.dev/packages/geolocator</a> &#8211; Für GPS-Zugriff und Berechtigungen.</li>



<li><strong><code>logging</code> Paket:</strong> <a href="https://pub.dev/packages/logging">https://pub.dev/packages/logging</a> &#8211; Für strukturiertes Logging.</li>



<li><strong><code>intl</code> Paket:</strong> <a href="https://pub.dev/packages/intl">https://pub.dev/packages/intl</a> &#8211; Für Internationalisierung und Formatierung (Datum, Zahlen).</li>



<li><strong><code>equatable</code> Paket:</strong> <a href="https://pub.dev/packages/equatable">https://pub.dev/packages/equatable</a> &#8211; Vereinfacht das Überschreiben von <code>==</code> und <code>hashCode</code> für Wert-Vergleiche.</li>
</ul>
</li>



<li><strong>State Management (Riverpod):</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Riverpod Dokumentation:</strong> <a href="https://riverpod.dev/">https://riverpod.dev/</a> &#8211; Die beste Quelle! Beginne mit &#8222;Getting Started&#8220;.</li>



<li><strong>Provider Typen (Übersicht):</strong> <a href="https://riverpod.dev/docs/concepts/providers">https://riverpod.dev/docs/concepts/providers</a> &#8211; Erklärt <code>Provider</code>, <code>StateNotifierProvider</code> etc.</li>



<li><strong><code>ref.watch</code> vs <code>ref.read</code>:</strong> <a href="https://riverpod.dev/docs/concepts/reading_providers">https://riverpod.dev/docs/concepts/reading_providers</a> &#8211; Ein fundamentales Konzept in Riverpod.</li>



<li><strong>Code Generierung:</strong> <a href="https://riverpod.dev/docs/concepts/code_generation">https://riverpod.dev/docs/concepts/code_generation</a> &#8211; Erklärung, wie <code>@riverpod</code> und <code>build_runner</code> funktionieren.</li>
</ul>
</li>



<li><strong>Dart Grundlagen:</strong>
<ul class="wp-block-list">
<li><strong>Asynchrones Programmieren (<code>Future</code>, <code>async</code>, <code>await</code>):</strong> <a href="https://dart.dev/codelabs/async-await">https://dart.dev/codelabs/async-await</a> &#8211; Essentiell für Netzwerk- und Geräte-Interaktionen.</li>



<li><strong>Fehlerbehandlung (<code>try-catch</code>, <code>Exceptions</code>):</strong> <a href="https://dart.dev/guides/language/language-tour#exceptions">https://dart.dev/guides/language/language-tour#exceptions</a></li>
</ul>
</li>



<li><strong>Android Spezifika:</strong>
<ul class="wp-block-list">
<li><strong>App Manifest (<code>AndroidManifest.xml</code>):</strong> <a href="https://developer.android.com/guide/topics/manifest/manifest-intro">https://developer.android.com/guide/topics/manifest/manifest-intro</a> &#8211; Grundlegende Informationen zur Manifest-Datei.</li>



<li><strong>Berechtigungen unter Android:</strong> <a href="https://developer.android.com/guide/topics/permissions/overview">https://developer.android.com/guide/topics/permissions/overview</a></li>
</ul>
</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-3/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">228</post-id>	</item>
		<item>
		<title>Deine Flutter Wetter-App: Schritt für Schritt – Teil 2</title>
		<link>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-2/</link>
					<comments>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-2/#respond</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Wed, 09 Apr 2025 16:31:30 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Wetter]]></category>
		<category><![CDATA[Wetter-App Entwicklung]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[VSCode]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=217</guid>

					<description><![CDATA[Teil 2: Das Fundament legen – Deine Flutter-Entwicklungsumgebung unter Windows einrichten Hallo zurück zu unserer Flutter-Wetter-App-Serie! In Teil 1 haben wir uns angesehen, was wir bauen wollen – eine Wetter-App mit aktuellen Daten, Verlauf, Prognose und sogar der Grünlandtemperatursumme – und warum eine Wetter-App ein großartiges Lernprojekt ist. Bevor wir jedoch die erste Zeile Code [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Teil 2: Das Fundament legen – Deine Flutter-Entwicklungsumgebung unter Windows einrichten</strong></p>



<p class="wp-block-paragraph">Hallo zurück zu unserer Flutter-Wetter-App-Serie!</p>



<p class="wp-block-paragraph">In <a href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt/">Teil 1</a> haben wir uns angesehen, <em>was</em> wir bauen wollen – eine Wetter-App mit aktuellen Daten, Verlauf, Prognose und sogar der Grünlandtemperatursumme – und <em>warum</em> eine Wetter-App ein großartiges Lernprojekt ist. Bevor wir jedoch die erste Zeile Code für unsere App schreiben können, brauchen wir das richtige Werkzeug und eine eingerichtete Werkstatt.</p>



<p class="wp-block-paragraph">Genau das ist das Ziel dieses zweiten Teils: Wir legen heute das Fundament und richten deine Entwicklungsumgebung auf deinem Windows-Rechner ein. Keine Sorge, das klingt vielleicht erstmal nach viel, aber es ist ein einmaliger Prozess. Wir gehen alles Schritt für Schritt durch!</p>



<p class="wp-block-paragraph"><strong>Was wir heute tun:</strong></p>



<ol class="wp-block-list">
<li><strong>Flutter SDK installieren:</strong> Das Herzstück, das alle nötigen Werkzeuge und Bibliotheken für Flutter enthält.</li>



<li><strong>Android Studio installieren:</strong> Auch wenn wir hauptsächlich mit VS Code arbeiten, brauchen wir Android Studio für wichtige Android-spezifische Werkzeuge (SDK, Emulator).</li>



<li><strong><code>flutter doctor</code> ausführen:</strong> Unser Diagnose-Tool, das prüft, ob alles korrekt eingerichtet ist.</li>



<li><strong>Ein Testgerät einrichten:</strong> Entweder einen Emulator (ein virtuelles Handy) oder dein echtes Android-Smartphone vorbereiten.</li>



<li><strong>Visual Studio Code (VS Code) konfigurieren:</strong> Unseren bevorzugten Code-Editor mit den nötigen Flutter-Erweiterungen ausstatten.</li>



<li><strong>Das erste Flutter-Projekt erstellen und starten:</strong> Sicherstellen, dass die Standard-App läuft und unsere Umgebung bereit ist.</li>
</ol>



<p class="wp-block-paragraph">Los geht&#8217;s!</p>



<p class="wp-block-paragraph"><strong>Schritt 1: Flutter SDK installieren</strong></p>



<p class="wp-block-paragraph">Das Flutter SDK (Software Development Kit) ist eine Sammlung von Werkzeugen, die es uns ermöglichen, Flutter-Anwendungen zu entwickeln und zu kompilieren.</p>



<ol class="wp-block-list">
<li><strong>Download:</strong> Gehe zur offiziellen Flutter-Installationsseite für Windows: <a href="https://docs.flutter.dev/get-started/install/windows">https://docs.flutter.dev/get-started/install/windows</a>
<ul class="wp-block-list">
<li>Lade die neueste <strong>stabile</strong> Version des Flutter SDK als ZIP-Datei herunter (suche nach dem blauen Button &#8222;Download the latest stable release of the Flutter SDK&#8220;).</li>
</ul>
</li>



<li><strong>Entpacken:</strong> Erstelle einen Ordner direkt auf deinem Laufwerk C: (oder einem anderen Laufwerk, wenn du möchtest), zum Beispiel <code>C:\flutter\</code>. <strong>Wichtig:</strong> Entpacke das Flutter SDK <strong>nicht</strong> in Ordner wie <code>C:\Program Files\</code> oder <code>C:\Program Files (x86)\</code>, da diese oft spezielle Berechtigungen erfordern, die zu Problemen führen können.
<ul class="wp-block-list">
<li>Entpacke den Inhalt der heruntergeladenen ZIP-Datei in den neu erstellten <code>C:\flutter\</code> Ordner. Du solltest jetzt einen Pfad wie <code>C:\flutter\bin</code> haben.</li>
</ul>
</li>



<li><strong>PATH-Umgebungsvariable aktualisieren:</strong> Damit dein Computer weiß, wo er die Flutter-Befehle finden kann, müssen wir den Pfad zum <code>bin</code>-Ordner von Flutter zur sogenannten PATH-Umgebungsvariable hinzufügen.
<ul class="wp-block-list">
<li>Gib &#8222;Umgebungsvariablen&#8220; in die Windows-Suche ein und wähle &#8222;Systemumgebungsvariablen bearbeiten&#8220;.</li>



<li>Klicke im neuen Fenster unten auf den Button &#8222;Umgebungsvariablen…&#8220;.</li>



<li>Suche im oberen Bereich (&#8222;Benutzervariablen für [Dein Benutzername]&#8220;) die Variable <code>Path</code>. Wähle sie aus und klicke auf &#8222;Bearbeiten…&#8220;. (Wenn sie nicht existiert, klicke auf &#8222;Neu…&#8220;.)</li>



<li>Klicke auf &#8222;Neu&#8220; und füge den vollständigen Pfad zu deinem Flutter <code>bin</code>-Ordner hinzu: <code>C:\flutter\bin</code> (passe dies an, falls du Flutter woanders entpackt hast).</li>



<li>Bestätige alle offenen Fenster mit &#8222;OK&#8220;.</li>



<li><strong>Wichtig:</strong> Damit die Änderung wirksam wird, musst du alle bereits geöffneten Kommandozeilenfenster (Eingabeaufforderung oder PowerShell) <strong>schließen und neu öffnen</strong>. Manchmal ist sogar ein Neustart des PCs nötig.</li>
</ul>
</li>



<li><strong>Überprüfung:</strong> Öffne eine <strong>neue</strong> Eingabeaufforderung (cmd) oder PowerShell und gib den Befehl ein:<br><code>bash flutter --version</code><br>Wenn alles geklappt hat, sollte Flutter dir nun seine Version und weitere Informationen anzeigen. Herzlichen Glückwunsch, Flutter ist installiert!</li>
</ol>



<p class="wp-block-paragraph"><strong>Schritt 2: Android Studio installieren (für Android SDK &amp; Co.)</strong></p>



<p class="wp-block-paragraph">Auch wenn wir VS Code zum Schreiben unseres Codes verwenden, ist Android Studio unerlässlich, da es das Android SDK, die Build-Tools und den Emulator-Manager mitbringt.</p>



<ol class="wp-block-list">
<li><strong>Download:</strong> Lade Android Studio von der offiziellen Seite herunter: <a href="https://developer.android.com/studio">https://developer.android.com/studio</a></li>



<li><strong>Installation:</strong> Führe die heruntergeladene <code>.exe</code>-Datei aus und folge dem Installationsassistenten. Wähle die Standardeinstellungen (&#8222;Standard&#8220; oder &#8222;Recommended&#8220;). Android Studio wird das neueste Android SDK, die SDK Platform-Tools und die SDK Build-Tools herunterladen und installieren.
<ul class="wp-block-list">
<li><strong>Merke dir den Installationsort des Android SDKs.</strong> Normalerweise ist das so etwas wie <code>C:\Users\DEIN_BENUTZERNAME\AppData\Local\Android\Sdk</code>. Du findest ihn auch später in Android Studio unter <code>File</code> &gt; <code>Settings</code> &gt; <code>Languages &amp; Frameworks</code> &gt;  <code>Android SDK</code>.</li>
</ul>
</li>



<li><strong>Android Studio starten:</strong> Starte Android Studio nach der Installation. Es wird eventuell noch einige Komponenten herunterladen.</li>



<li><strong>(Optional, aber empfohlen) Flutter und Dart Plugins:</strong> Auch wenn wir VS Code nutzen, installieren wir die Flutter- und Dart-Plugins in Android Studio. Das hilft <code>flutter doctor</code> bei der Erkennung und kann nützlich sein, falls du doch mal eine Funktion von Android Studio brauchst.
<ul class="wp-block-list">
<li>Gehe in Android Studio zu <code>File</code> &gt; <code>Settings</code> &gt; <code>Plugins</code>.</li>



<li>Suche im &#8222;Marketplace&#8220;-Tab nach &#8222;Flutter&#8220; und klicke auf &#8222;Install&#8220;. Akzeptiere die Installation des Dart-Plugins, wenn du dazu aufgefordert wirst.</li>



<li>Starte Android Studio neu, wenn du dazu aufgefordert wirst.</li>
</ul>
</li>



<li><strong>Android SDK Command-line Tools:</strong> Stelle sicher, dass diese installiert sind.
<ul class="wp-block-list">
<li>Gehe in Android Studio zu <code>File</code> &gt; <code>Settings</code> &gt; <code>Languages &amp; Frameworks</code> &gt; <code>Android SDK</code>.</li>



<li>Wähle den Tab &#8222;SDK Tools&#8220;.</li>



<li>Setze einen Haken bei &#8222;Android SDK Command-line Tools (latest)&#8220;.</li>



<li>Klicke auf &#8222;Apply&#8220; oder &#8222;OK&#8220;, um sie zu installieren.<br><img loading="lazy" decoding="async" width="973" height="731" data-attachment-id="218" data-permalink="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-2/attachment/clipboard02/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard02.jpg" data-orig-size="973,731" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="SDK Tools" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard02.jpg" class="wp-image-218" style="width: 973px;" src="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard02.jpg" alt="" srcset="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard02.jpg 973w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard02-300x225.jpg 300w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard02-768x577.jpg 768w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard02-676x508.jpg 676w" sizes="auto, (max-width: 973px) 100vw, 973px" /></li>
</ul>
</li>



<li><strong>Android-Lizenzen akzeptieren:</strong> Flutter muss sicherstellen, dass du die Lizenzen für das Android SDK akzeptiert hast. Öffne eine <strong>neue</strong> Eingabeaufforderung oder PowerShell und führe aus:<br><code>bash flutter doctor --android-licenses</code><br>Lies die Lizenzbedingungen durch und gib bei jeder Abfrage <code>y</code> (für yes) ein, um sie zu akzeptieren.</li>
</ol>



<p class="wp-block-paragraph"><strong>Schritt 3: <code>flutter doctor</code> – Der Gesundheitscheck</strong></p>



<p class="wp-block-paragraph">Jetzt ist es Zeit für einen Check-up! <code>flutter doctor</code> ist ein Befehl, der deine Umgebung überprüft und dir sagt, ob alles für die Flutter-Entwicklung bereit ist oder ob noch etwas fehlt.</p>



<p class="wp-block-paragraph">Öffne eine neue Eingabeaufforderung oder PowerShell und führe aus:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">flutter doctor</pre>



<p class="wp-block-paragraph">Du wirst eine Ausgabe ähnlich dieser sehen (kann bei dir leicht abweichen):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.x.x, on Microsoft Windows [Version ...], locale de-DE)
[✓] Android toolchain - develop for Android devices (Android SDK version 3x.x.x)
[✓] Chrome (visualize Flutter web apps with Chrome)
[!] Visual Studio - develop for Windows (Visual Studio not installed)  &lt;-- Ignorieren, wenn du nur für Android entwickelst
[✓] Android Studio (version 202x.x.x)
[✓] VS Code (version 1.x.x)
[✓] Connected device (1 available)                                  &lt;-- Oder 'No devices available'
[✓] Network resources

* No issues found!</pre>



<ul class="wp-block-list">
<li><strong>Was bedeutet das?</strong>
<ul class="wp-block-list">
<li><code>[✓]</code> (Haken): Alles in Ordnung für diese Komponente!</li>



<li><code>[!]</code> (Ausrufezeichen): Es gibt ein Problem oder eine Empfehlung. Lies die Meldung genau durch, <code>flutter doctor</code> gibt oft Hinweise zur Lösung. (Das <code>Visual Studio</code> für Windows-Entwicklung kannst du ignorieren, wenn du nur für Android entwickelst).</li>



<li><code>[✗]</code> (Kreuz): Etwas Wichtiges fehlt oder ist falsch konfiguriert.</li>



<li><code>[?]</code> (Fragezeichen): Etwas konnte nicht überprüft werden.</li>
</ul>
</li>



<li><strong>Ziel:</strong> Wir wollen Haken bei <code>Flutter</code>, <code>Android toolchain</code>, <code>Android Studio</code> (oder zumindest, dass es erkannt wird) und später bei <code>VS Code</code> und <code>Connected device</code>.</li>



<li><strong>Keine Panik:</strong> Wenn nicht sofort alles grün ist, ist das normal! Lies die Meldungen von <code>flutter doctor</code> und folge den Anweisungen. Oft fehlt nur ein kleiner Schritt oder ein Neustart.</li>
</ul>



<p class="wp-block-paragraph"><strong>Schritt 4: Ein Testgerät einrichten</strong></p>



<p class="wp-block-paragraph">Um deine App zu sehen und zu testen, brauchst du ein Android-Gerät. Du hast zwei Möglichkeiten:</p>



<p class="wp-block-paragraph"><strong>Option A: Android Emulator (Virtuelles Gerät)</strong></p>



<p class="wp-block-paragraph">Ein Emulator simuliert ein Android-Gerät auf deinem Computer.</p>



<ol class="wp-block-list">
<li><strong>AVD Manager öffnen:</strong> Klicke auf dem Willkommensbildschirm auf <code>More Actions</code> -&gt; <code>Virtual Device Manager</code> (oder wenn ein Projekt offen ist: <code>Tools</code> -&gt; <code>Device Manager</code>).</li>



<li><strong>Gerät erstellen:</strong> Klicke auf &#8222;Create device&#8220;.
<ul class="wp-block-list">
<li>Wähle eine Hardware aus (z.B. &#8222;Pixel 6&#8220; oder eine ähnliche, aktuelle Geräteklasse). Klicke &#8222;Next&#8220;.</li>



<li>Wähle ein System-Image aus (eine Android-Version). Lade eines herunter, falls noch keines vorhanden ist (empfohlen: eine relativ aktuelle API-Version, z.B. API 33 oder 34). Klicke &#8222;Next&#8220;.</li>



<li>Gib dem virtuellen Gerät (AVD) einen Namen und klicke auf &#8222;Finish&#8220;.<br><img loading="lazy" decoding="async" width="895" height="686" data-attachment-id="220" data-permalink="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-2/attachment/clipboard03/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard03.jpg" data-orig-size="895,686" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Configure Virtual Device" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard03.jpg" class="wp-image-220" style="width: 895px;" src="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard03.jpg" alt="" srcset="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard03.jpg 895w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard03-300x230.jpg 300w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard03-768x589.jpg 768w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard03-676x518.jpg 676w" sizes="auto, (max-width: 895px) 100vw, 895px" /></li>
</ul>
</li>



<li><strong>Emulator starten:</strong> Wähle dein neu erstelltes Gerät im Device Manager aus und klicke auf das Play-Symbol (<img src="https://s.w.org/images/core/emoji/15.1.0/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" />) in der &#8222;Actions&#8220;-Spalte, um es zu starten. Es kann einen Moment dauern, bis der Emulator hochgefahren ist.
<ul class="wp-block-list">
<li><strong>Performance-Hinweis:</strong> Emulatoren können auf manchen Rechnern langsam sein. Stelle sicher, dass die Hardware-Virtualisierung (Intel HAXM oder AMD Hypervisor / Windows Hypervisor Platform) in deinem BIOS/UEFI aktiviert ist und in Android Studio konfiguriert wurde (passiert oft automatisch).</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"><strong>Option B: Physisches Android-Gerät (Dein Smartphone)</strong></p>



<p class="wp-block-paragraph">Du kannst auch dein eigenes Android-Handy zum Testen verwenden.</p>



<ol class="wp-block-list">
<li><strong>Entwickleroptionen aktivieren:</strong> Gehe auf deinem Handy zu <code>Einstellungen</code> &gt; <code>Über das Telefon</code>. Tippe dort mehrmals schnell hintereinander auf die &#8222;Build-Nummer&#8220;, bis eine Meldung erscheint wie &#8222;Du bist jetzt Entwickler!&#8220;.</li>



<li><strong>USB-Debugging aktivieren:</strong> Gehe zurück zu den <code>Einstellungen</code>. Suche nach dem neuen Menüpunkt <code>Entwickleroptionen</code> (manchmal unter <code>System</code> &gt; <code>Erweitert</code>). Aktiviere dort die Option <code>USB-Debugging</code>. Bestätige die Warnmeldung.</li>



<li><strong>USB-Treiber (falls nötig):</strong> Verbinde dein Handy per USB-Kabel mit dem Computer. Windows versucht normalerweise, die richtigen Treiber automatisch zu installieren. Falls dein Gerät nicht erkannt wird, suche auf der Website des Handy-Herstellers nach spezifischen &#8222;OEM USB Drivers&#8220; für dein Modell und installiere sie.</li>



<li><strong>Verbindung autorisieren:</strong> Wenn du dein Handy zum ersten Mal mit aktiviertem USB-Debugging verbindest, erscheint auf dem Handy eine Meldung &#8222;USB-Debugging zulassen?&#8220;. Setze einen Haken bei &#8222;Von diesem Computer immer zulassen&#8220; und tippe auf &#8222;OK&#8220; oder &#8222;Zulassen&#8220;.</li>
</ol>



<p class="wp-block-paragraph"><strong>Überprüfung:</strong> Egal ob Emulator oder echtes Gerät, öffne eine neue Eingabeaufforderung und führe aus:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">flutter devices</pre>



<p class="wp-block-paragraph">Dein verbundenes Gerät oder der laufende Emulator sollte nun in der Liste erscheinen! <code>flutter doctor</code> sollte jetzt auch einen Haken bei <code>Connected device</code> zeigen.</p>



<p class="wp-block-paragraph"><strong>Schritt 5: Visual Studio Code (VS Code) einrichten</strong></p>



<p class="wp-block-paragraph">VS Code ist unser bevorzugter Editor zum Schreiben des Flutter-Codes.</p>



<ol class="wp-block-list">
<li><strong>Download &amp; Installation:</strong> Lade VS Code herunter und installiere es: <a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a> . Die Installation ist unkompliziert.</li>



<li><strong>Flutter Extension installieren:</strong>
<ul class="wp-block-list">
<li>Starte VS Code.</li>



<li>Klicke auf das Extensions-Symbol in der linken Seitenleiste (sieht aus wie vier Quadrate).</li>



<li>Suche nach &#8222;Flutter&#8220;.</li>



<li>Wähle die offizielle Extension von &#8222;Dart Code&#8220; aus und klicke auf &#8222;Install&#8220;. Diese Extension installiert automatisch auch die notwendige &#8222;Dart&#8220;-Extension.<br><img loading="lazy" decoding="async" width="345" height="278" data-attachment-id="221" data-permalink="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-2/attachment/clipboard04/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard04.jpg" data-orig-size="345,278" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="VSCode Extensions" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard04.jpg" class="wp-image-221" style="width: 345px;" src="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard04.jpg" alt="" srcset="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard04.jpg 345w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard04-300x242.jpg 300w" sizes="auto, (max-width: 345px) 100vw, 345px" /></li>



<li>Starte VS Code neu, wenn du dazu aufgefordert wirst.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"><strong>Schritt 6: Das erste Flutter-Projekt erstellen und starten</strong></p>



<p class="wp-block-paragraph">Endlich! Zeit, unser erstes (Standard-)Flutter-Projekt zu erstellen und zu sehen, ob alles funktioniert.</p>



<ol class="wp-block-list">
<li><strong>Projekt erstellen:</strong>
<ul class="wp-block-list">
<li>Öffne VS Code.</li>



<li>Öffne die Command Palette mit <code>Strg+Shift+P</code> (oder <code>Ctrl+Shift+P</code>).</li>



<li>Tippe &#8222;Flutter: New Project&#8220; und wähle die Option aus.</li>



<li>Wähle &#8222;Application&#8220;.</li>



<li>Wähle einen Ordner auf deinem Computer, wo das Projekt gespeichert werden soll (z.B. <code>C:\dev\flutter_projekte\</code>).</li>



<li>Gib einen Namen für dein Projekt ein. <strong>Wichtig:</strong> Der Name muss klein geschrieben sein und darf nur Buchstaben, Zahlen und Unterstriche enthalten (z.B. <code>flutter_weather_app_blog</code>). Drücke Enter.</li>



<li>VS Code erstellt nun die Projektstruktur und lädt eventuell noch benötigte Pakete herunter. Das kann einen Moment dauern.</li>
</ul>
</li>



<li><strong>Gerät auswählen:</strong> Stelle sicher, dass dein Emulator läuft oder dein Handy verbunden und erkannt ist. In der unteren rechten Ecke der VS Code Statusleiste solltest du nun dein Gerät auswählen können (klicke auf den Gerätenamen oder &#8222;No Device&#8220;).<br><img loading="lazy" decoding="async" width="397" height="129" data-attachment-id="225" data-permalink="https://allround-blog.de/clipboard05/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard05.jpg" data-orig-size="397,129" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="device" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard05.jpg" class="wp-image-225" style="width: 397px;" src="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard05.jpg" alt="" srcset="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard05.jpg 397w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard05-300x97.jpg 300w" sizes="auto, (max-width: 397px) 100vw, 397px" /></li>



<li><strong>App starten:</strong>
<ul class="wp-block-list">
<li>Öffne die Datei <code>lib/main.dart</code>. Das ist der Einstiegspunkt der App.</li>



<li>Drücke <code>F5</code> oder gehe im Menü auf <code>Run</code> &gt; <code>Start Debugging</code>.</li>



<li>Flutter wird nun die App kompilieren und auf deinem ausgewählten Gerät installieren und starten. Der erste Start kann etwas länger dauern.</li>
</ul>
</li>



<li><strong>Erfolg!</strong> Du solltest nun die Flutter-Standard-Demo-App sehen (die mit dem Zähler und dem blauen Button). Wenn du auf den Button tippst, erhöht sich der Zähler.<br> <img loading="lazy" decoding="async" width="471" height="860" data-attachment-id="226" data-permalink="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-2/attachment/clipboard07/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard07.jpg" data-orig-size="471,860" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="demo-app" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard07.jpg" class="wp-image-226" style="width: 471px;" src="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard07.jpg" alt="" srcset="https://allround-blog.de/wp-content/uploads/2025/04/Clipboard07.jpg 471w, https://allround-blog.de/wp-content/uploads/2025/04/Clipboard07-164x300.jpg 164w" sizes="auto, (max-width: 471px) 100vw, 471px" /></li>
</ol>



<p class="wp-block-paragraph"><strong>Wenn etwas nicht klappt (Troubleshooting):</strong></p>



<ul class="wp-block-list">
<li><strong><code>flutter</code> Befehl nicht gefunden:</strong> Überprüfe nochmal genau die PATH-Variable (Schritt 1.3). Hast du den richtigen Pfad (<code>C:\flutter\bin</code>) hinzugefügt? Hast du die Eingabeaufforderung/VS Code neu gestartet? Manchmal hilft ein PC-Neustart.</li>



<li><strong><code>flutter doctor</code> zeigt Fehler bei <code>Android toolchain</code>:</strong> Stelle sicher, dass Android Studio korrekt installiert ist, die Command-line Tools vorhanden sind (Schritt 2.5) und du die Lizenzen akzeptiert hast (Schritt 2.6). Manchmal muss man Flutter explizit sagen, wo das SDK liegt: <code>flutter config --android-sdk C:\Users\DEIN_BENUTZERNAME\AppData\Local\Android\Sdk</code> (Pfad anpassen).</li>



<li><strong>Emulator startet nicht oder ist sehr langsam:</strong> Überprüfe die Virtualisierungs-Einstellungen im BIOS/UEFI deines PCs und stelle sicher, dass HAXM/Hypervisor installiert und aktiviert ist (Android Studio hilft dabei oft). Gib dem Emulator ggf. mehr RAM in den AVD-Einstellungen (aber nicht zu viel!).</li>



<li><strong>Echtes Gerät wird nicht erkannt:</strong> USB-Debugging aktiviert? Verbindung autorisiert? Richtige USB-Treiber installiert? Probiere ein anderes USB-Kabel oder einen anderen USB-Port.</li>



<li><strong>Weitere Hilfe:</strong> Die offizielle Flutter-Dokumentation (<a href="https://docs.flutter.dev/get-started/install/windows">https://docs.flutter.dev/get-started/install/windows</a>) ist sehr detailliert und eine großartige Ressource bei Problemen.</li>
</ul>



<p class="wp-block-paragraph"><strong>Geschafft! Was kommt als Nächstes?</strong></p>



<p class="wp-block-paragraph">Puh, das war der aufwendigste, aber notwendige Teil! Du hast jetzt eine voll funktionsfähige Flutter-Entwicklungsumgebung auf deinem Windows-Rechner. Dein Werkzeugkasten ist bereit!</p>



<p class="wp-block-paragraph">Herzlichen Glückwunsch zu diesem wichtigen Meilenstein! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Im <strong>nächsten Teil (Teil 3)</strong> wird es richtig spannend: Wir werfen den Demo-Code raus und beginnen mit der Entwicklung unserer Wetter-App. Wir werden:</p>



<ul class="wp-block-list">
<li>Die <strong>Projektstruktur</strong> und <strong>Architektur</strong> anlegen (Services, Repository, State Management mit Riverpod).</li>



<li>Den <strong>aktuellen GPS-Standort</strong> des Geräts abfragen.</li>



<li>Unsere <strong>erste API-Anfrage</strong> an Open-Meteo senden, um die <strong>aktuelle Temperatur</strong> zu bekommen.</li>



<li>Die Temperatur auf dem Bildschirm <strong>anzeigen</strong>.</li>



<li>Erklären, warum wir von Anfang an auf eine <strong>solide Architektur</strong> setzen.</li>
</ul>



<p class="wp-block-paragraph">Bleib dran, es geht jetzt richtig los mit dem Code!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Weiterführende Ressourcen &amp; Vertiefung (für Teil 2)</strong></p>



<p class="wp-block-paragraph">Die Einrichtung der Entwicklungsumgebung ist ein entscheidender Schritt. Hier sind Links zu den offiziellen Anleitungen und wichtigen Werkzeugen:</p>



<ol class="wp-block-list">
<li><strong>Flutter SDK Installation (Windows):</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Anleitung:</strong> <a href="https://docs.flutter.dev/get-started/install/windows">https://docs.flutter.dev/get-started/install/windows</a> &#8211; Die detaillierte Schritt-für-Schritt-Anleitung von Flutter, falls du auf Probleme stößt. Enthält auch Infos zur PATH-Variable.</li>
</ul>
</li>



<li><strong>Android Studio &amp; Android SDK:</strong>
<ul class="wp-block-list">
<li><strong>Android Studio Download:</strong> <a href="https://developer.android.com/studio">https://developer.android.com/studio</a> &#8211; Offizielle Download-Seite.</li>



<li><strong>Android SDK Übersicht:</strong> <a href="https://developer.android.com/studio/command-line/sdkmanager">https://developer.android.com/studio/command-line/sdkmanager</a> &#8211; Erklärt die Komponenten des Android SDK (auch wenn wir meist den Manager in Android Studio nutzen).</li>
</ul>
</li>



<li><strong><code>flutter doctor</code>:</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Dokumentation:</strong> <a href="https://docs.flutter.dev/reference/flutter-cli#flutter-doctor">https://docs.flutter.dev/reference/flutter-cli#flutter-doctor</a> &#8211; Erklärung des Befehls und seiner Bedeutung.</li>
</ul>
</li>



<li><strong>Android-Geräte für Tests einrichten:</strong>
<ul class="wp-block-list">
<li><strong>Emulator erstellen &amp; verwalten:</strong> <a href="https://developer.android.com/studio/run/managing-avds">https://developer.android.com/studio/run/managing-avds</a> &#8211; Anleitung von Google zum Android Virtual Device Manager.</li>



<li><strong>Physisches Gerät einrichten (Entwickleroptionen &amp; USB-Debugging):</strong> <a href="https://developer.android.com/studio/run/device">https://developer.android.com/studio/run/device</a> &#8211; Offizielle Anleitung zum Einrichten eines echten Geräts.</li>



<li><strong>OEM USB Drivers:</strong> <a href="https://developer.android.com/studio/run/oem-usb">https://developer.android.com/studio/run/oem-usb</a> &#8211; Liste von Links zu Treiber-Downloads verschiedener Handy-Hersteller (falls Windows das Gerät nicht automatisch erkennt).</li>
</ul>
</li>



<li><strong>Visual Studio Code &amp; Flutter Extension:</strong>
<ul class="wp-block-list">
<li><strong>Flutter in VS Code:</strong> <a href="https://docs.flutter.dev/tools/vs-code">https://docs.flutter.dev/tools/vs-code</a> &#8211; Offizielle Anleitung zur Nutzung von Flutter mit VS Code, inklusive Installation der Extension.</li>
</ul>
</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">217</post-id>	</item>
		<item>
		<title>Deine Flutter Wetter-App: Schritt für Schritt: Teil 1</title>
		<link>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt/</link>
					<comments>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt/#comments</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Wed, 02 Apr 2025 14:48:14 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Wetter]]></category>
		<category><![CDATA[Wetter-App Entwicklung]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=161</guid>

					<description><![CDATA[Teil 1: Startschuss zur Flutter Wetter-App – Was wir bauen und warum Hallo und herzlich willkommen zu unserer neuen Blog-Serie! Du wolltest schon immer mal eine eigene App entwickeln, bist neugierig auf Flutter und Dart oder suchst ein praktisches Projekt, um deine Kenntnisse zu vertiefen? Dann bist du hier genau richtig! In dieser Serie nehmen [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Teil 1: Startschuss zur Flutter Wetter-App – Was wir bauen und warum</h2>



<p class="wp-block-paragraph">Hallo und herzlich willkommen zu unserer neuen Blog-Serie! Du wolltest schon immer mal eine eigene App entwickeln, bist neugierig auf Flutter und Dart oder suchst ein praktisches Projekt, um deine Kenntnisse zu vertiefen? Dann bist du hier genau richtig!</p>



<p class="wp-block-paragraph">In dieser Serie nehmen wir dich an die Hand und entwickeln gemeinsam, Schritt für Schritt, eine Wetter-App für Android. Wir nutzen dafür das moderne Framework Flutter mit der Programmiersprache Dart und entwickeln unter Windows mit dem beliebten Editor Visual Studio Code (VS Code).</p>



<p class="wp-block-paragraph"><strong>Warum diese Serie?</strong></p>



<p class="wp-block-paragraph">Es gibt unzählige Tutorials und Dokumentationen da draußen. Warum also noch eine Serie? Unser Ziel ist es, zwei Fliegen mit einer Klappe zu schlagen:</p>



<ol class="wp-block-list">
<li><strong>Flutter &amp; Dart praxisnah lernen:</strong> Statt trockener Theorie wollen wir direkt in die Entwicklung einsteigen und Konzepte wie Widgets, State Management, API-Anfragen und die Nutzung von Geräte-Features (wie GPS) an einem konkreten Beispiel erlernen.</li>



<li><strong>Eine sinnvolle App erstellen:</strong> Am Ende soll nicht nur Code stehen, sondern eine tatsächlich nutzbare Wetter-App, die interessante Informationen liefert – über das typische &#8222;Hello World&#8220; hinaus.</li>
</ol>



<p class="wp-block-paragraph">Diese Serie richtet sich sowohl an Einsteiger, die ihre erste App bauen wollen, als auch an Entwickler, die vielleicht von anderen Plattformen kommen und Flutter kennenlernen möchten.</p>



<p class="wp-block-paragraph"><strong>Das Zielprojekt: Unsere Wetter-App</strong></p>



<p class="wp-block-paragraph">Was genau wollen wir bauen? Eine Wetter-App, die folgende Funktionen bieten soll:</p>



<ol class="wp-block-list">
<li><strong>Aktuelle Temperatur:</strong> Zuerst ganz einfach: Die App soll die momentane <a href="https://allround-blog.de/software/freie-wetterdaten-nutzen-anwendungen-und-praktische-tipps/">Temperatur für einen bestimmten Ort </a>anzeigen können. Als Datenquelle nutzen wir die kostenlose und umfangreiche API von <a href="https://www.google.com/url?sa=E&amp;q=https%3A%2F%2Fopen-meteo.com%2F" target="_blank" rel="noreferrer noopener">open-meteo.com</a>.</li>



<li><strong>Flexible Ortswahl:</strong> Später soll es möglich sein, entweder den <strong>aktuellen Standort</strong> des Geräts per GPS zu verwenden oder eine <strong>beliebige Adresse</strong> einzugeben, für die das Wetter angezeigt werden soll.</li>



<li><strong>Temperaturverlauf als Diagramm:</strong> Wir wollen nicht nur den aktuellen Wert sehen, sondern auch ein <strong>Liniendiagramm</strong>, das die Temperaturentwicklung der <strong>letzten Woche</strong> zeigt und eine <strong>Prognose für die kommende Woche</strong> gibt.</li>



<li><strong>Spezialfunktion: <a href="https://allround-blog.de/imkerei/gruenlandtemperatursumme-und-ihre-bedeutung-fuer-die-imkerei/">Grünlandtemperatursumme </a>(GTS):</strong> Für Landwirte, Gärtner oder einfach nur Interessierte wollen wir die aktuelle Grünlandtemperatursumme für den gewählten Ort berechnen und anzeigen. Dies ist ein agrarmeteorologischer Wert, der den Vegetationsbeginn im Frühjahr anzeigt.</li>
</ol>



<p class="wp-block-paragraph"><strong>Warum eine Wetter-App?</strong></p>



<p class="wp-block-paragraph">Eine Wetter-App ist ein ideales Lernprojekt, weil sie viele typische Aspekte der App-Entwicklung abdeckt:</p>



<ul class="wp-block-list">
<li><strong>Benutzeroberfläche (UI):</strong> Gestaltung ansprechender Ansichten zur Darstellung von Daten.</li>



<li><strong>Netzwerkkommunikation:</strong> Abrufen von Daten von einer externen API (Application Programming Interface).</li>



<li><strong>Datenverarbeitung:</strong> Umwandlung der API-Antworten in ein nutzbares Format.</li>



<li><strong>Geräte-Integration:</strong> Zugriff auf den Standort des Geräts (GPS).</li>



<li><strong>Datenvisualisierung:</strong> Darstellung von Daten in Diagrammen.</li>



<li><strong>State Management:</strong> Verwalten des Zustands der App (z.B. welcher Ort ist gewählt, welche Daten sind geladen).</li>
</ul>



<p class="wp-block-paragraph"><strong>Der Technologie-Stack: Womit arbeiten wir?</strong></p>



<ul class="wp-block-list">
<li><strong>Flutter:</strong> Googles UI-Toolkit zur Erstellung von nativ kompilierten Anwendungen für Mobilgeräte, Web und Desktop aus einer einzigen Codebasis.</li>



<li><strong>Dart:</strong> Die objektorientierte Programmiersprache hinter Flutter.</li>



<li><strong>Visual Studio Code (VS Code):</strong> Ein kostenloser, plattformübergreifender und sehr beliebter Code-Editor mit hervorragender Flutter/Dart-Unterstützung.</li>



<li><strong>Windows:</strong> Unser Entwicklungsbetriebssystem.</li>



<li><strong>Open-Meteo.com API:</strong> Unsere Quelle für Wetterdaten. Kostenlos, keine Registrierung nötig und sehr umfangreich.</li>



<li><strong>Diverse Flutter Packages:</strong> Wir werden verschiedene &#8222;Bibliotheken&#8220; (Packages) nutzen, um uns Arbeit abzunehmen, z.B. für HTTP-Anfragen (http), Standortbestimmung (geolocator, geocoding), Diagramme (fl_chart) und mehr. <br>(Wir werden diese nach und nach in der Serie einführen und erklären)</li>
</ul>



<p class="wp-block-paragraph"><strong>Der Weg: Unsere Blog-Serie</strong></p>



<p class="wp-block-paragraph">Wir werden das Projekt in logische Schritte unterteilen, wobei jeder Blog-Post einen oder mehrere dieser Schritte abdeckt:</p>



<ol class="wp-block-list">
<li><strong>(Dieser Post):</strong> Einführung und Zieldefinition.</li>



<li><strong>Teil 2:</strong> Das Fundament legen &#8211; Deine Flutter-Entwicklungsumgebung unter Windows einrichten.</li>



<li><strong>Teil 3:</strong> Der erste Meilenstein: Aktuelle Temperatur am aktuellen Ort – Wir bauen die Kernarchitektur (Services, Repository, State Management mit Riverpod), holen die GPS-Position, fragen die Open-Meteo API nach der aktuellen Temperatur und zeigen diese an. Hier erklären wir, warum eine gute Struktur von Anfang an wichtig ist.</li>



<li><strong>Teil 4:</strong> Mehr Orte, mehr Möglichkeiten – Adresseingabe hinzufügen und zwischen Standorten wechseln.</li>



<li><strong>Teil 5:</strong> Kurven zeichnen &#8211; Temperaturverläufe mit Diagrammen visualisieren.</li>



<li><strong>Teil 6:</strong> Grünland im Blick &#8211; Die Grünlandtemperatursumme berechnen und anzeigen.</li>



<li><em>(Eventuell weitere Teile für z.B. Code-Optimierung, Testing-Vertiefung, UI-Verfeinerung)</em></li>
</ol>



<p class="wp-block-paragraph">Jeder Teil enthält detaillierte Anleitungen, Code-Snippets und Erklärungen, sodass du dem Prozess gut folgen kannst. <br>Wir legen von Anfang an Wert auf eine saubere und testbare Code-Struktur, wie sie auch in professionellen Projekten verwendet wird – selbst wenn die erste Funktion noch einfach erscheint.</p>



<p class="wp-block-paragraph"><strong>Bist du bereit?</strong></p>



<p class="wp-block-paragraph">Wir hoffen, diese Einführung hat dein Interesse geweckt! Im nächsten Teil machen wir unsere Hände schmutzig und richten die notwendige Software auf deinem Windows-Rechner ein, damit wir mit der eigentlichen Entwicklung starten können.</p>



<p class="wp-block-paragraph">Bleib dran und begleite uns auf der Reise zur fertigen Flutter Wetter-App!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Weiterführende Ressourcen &amp; Vertiefung (für Teil 1)</strong></p>



<p class="wp-block-paragraph">In diesem ersten Teil haben wir das Projekt vorgestellt und die Technologien benannt. Hier sind einige Links, um einen ersten Eindruck zu bekommen:</p>



<ol class="wp-block-list">
<li><strong>Flutter:</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Flutter Webseite:</strong> <a href="https://flutter.dev/">https://flutter.dev/</a> &#8211; Der beste Startpunkt, um zu sehen, was Flutter ist und was man damit machen kann.</li>



<li><strong>Was ist Flutter? (Video):</strong> <a href="https://www.youtube.com/watch?v=fq4N0hgOWzU">https://www.youtube.com/watch?v=fq4N0hgOWzU</a> &#8211; Eine kurze Einführung von Google.</li>
</ul>
</li>



<li><strong>Dart:</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Dart Webseite:</strong> <a href="https://dart.dev/">https://dart.dev/</a> &#8211; Alles über die Programmiersprache hinter Flutter.</li>



<li><strong>Dart Sprach-Tour (Guter Einstieg):</strong> <a href="https://dart.dev/guides/language/language-tour">https://dart.dev/guides/language/language-tour</a> &#8211; Eine interaktive Tour durch die wichtigsten Sprachmerkmale.</li>
</ul>
</li>



<li><strong>Visual Studio Code (VS Code):</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Webseite:</strong> <a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a> &#8211; Download und Informationen zum Editor.</li>
</ul>
</li>



<li><strong>Open-Meteo API:</strong>
<ul class="wp-block-list">
<li><strong>Offizielle Webseite:</strong> <a href="https://open-meteo.com/">https://open-meteo.com/</a> &#8211; Hier kannst du sehen, welche Wetterdaten verfügbar sind und die API-Dokumentation erkunden (das machen wir später genauer).</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">161</post-id>	</item>
		<item>
		<title>Freie Wetterdaten nutzen: Anwendungen und praktische Tipps</title>
		<link>https://allround-blog.de/software/freie-wetterdaten-nutzen-anwendungen-und-praktische-tipps/</link>
					<comments>https://allround-blog.de/software/freie-wetterdaten-nutzen-anwendungen-und-praktische-tipps/#comments</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Tue, 01 Apr 2025 16:45:50 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Wetter]]></category>
		<category><![CDATA[Wetter-App Entwicklung]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=147</guid>

					<description><![CDATA[Einleitung Freie Wetterdaten sind eine wertvolle Ressource für Entwickler, Forscher, Landwirte, Outdoor-Enthusiasten und viele mehr. Dank offener APIs und frei zugänglicher Wetterdatensätze lassen sich präzise Analysen durchführen, innovative Anwendungen entwickeln und fundierte Entscheidungen treffen. In diesem Artikel zeigen wir Ihnen, wozu Sie frei verfügbare Wetterdaten nutzen können und wie Sie diese praktisch einsetzen. Wozu lassen [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Einleitung</strong> Freie Wetterdaten sind eine wertvolle Ressource für Entwickler, Forscher, Landwirte, Outdoor-Enthusiasten und viele mehr. Dank offener APIs und frei zugänglicher Wetterdatensätze lassen sich präzise Analysen durchführen, innovative Anwendungen entwickeln und fundierte Entscheidungen treffen. In diesem Artikel zeigen wir Ihnen, wozu Sie frei verfügbare Wetterdaten nutzen können und wie Sie diese praktisch einsetzen.</p>



<p class="wp-block-paragraph"><strong>Wozu lassen sich Wetterdaten nutzen?</strong></p>



<ol start="1" class="wp-block-list">
<li><strong>Landwirtschaft und Gartenbau</strong>: Durch genaue Messwerte zu Temperatur, Niederschlag und Bodenfeuchte können Landwirte die Bewässerung optimieren, Ernteausfälle reduzieren und Schädlinge besser kontrollieren.</li>



<li><strong>Smart Home &amp; IoT</strong>: Wetterdaten können in Smart-Home-Systeme integriert werden, um beispielsweise automatische Rollläden zu steuern oder Heizsysteme zu optimieren.</li>



<li><strong>Reise- und Freizeitplanung</strong>: Outdoor-Aktivitäten wie Wandern, Segeln oder Camping lassen sich anhand lokaler Wetterbedingungen sicherer gestalten.</li>



<li><strong>Umwelt- und Klimaforschung</strong>: Langfristige Messdaten helfen Wissenschaftlern, Klimatrends zu analysieren und Umweltveränderungen zu untersuchen.</li>



<li><strong>Energiebranche</strong>: Solar- und Windkraftanlagen können durch Messwerte zu Sonneneinstrahlung und Windgeschwindigkeit effizienter gesteuert werden.</li>



<li><strong>App-Entwicklung</strong>: Entwickler können Wetterdaten in ihre Apps und Websites integrieren, um nützliche Funktionen wie Wetterwarnungen oder personalisierte Analysen bereitzustellen.</li>



<li><strong>Lokale Wetterstationen &amp; Community-Projekte</strong>: Bürgerwissenschaftler und Wetterenthusiasten können mit lokalen Wetterstationen präzisere, hyperlokale Daten erfassen und teilen.</li>
</ol>



<p class="wp-block-paragraph"><strong>Wie kommt man an freie Wetterdaten?</strong> Es gibt zahlreiche Plattformen und Anbieter, die frei verfügbare Messwerte bereitstellen. Hier eine umfangreiche Liste mit deutschsprachigen und internationalen Quellen:</p>



<ul class="wp-block-list">
<li><strong>Deutscher Wetterdienst (DWD)</strong> (<a href="https://www.dwd.de/">https://www.dwd.de/</a>) – Messwerte zu Temperatur, Wind, Niederschlag und mehr aus Deutschland.</li>



<li><strong>Meteostat</strong> (<a href="https://meteostat.net/">https://meteostat.net/</a>) – Historische Wetterdaten weltweit, mit API-Zugriff.</li>



<li><strong>Wetterdienst.de</strong> (<a href="https://www.wetterdienst.de/">https://www.wetterdienst.de/</a>) – Aggregierte Wetterdaten für Deutschland.</li>



<li><strong>MeteoSwiss</strong> (<a href="https://www.meteoswiss.admin.ch/">https://www.meteoswiss.admin.ch/</a>) – Wetterdaten für die Schweiz.</li>



<li><strong>ZAMG (Zentralanstalt für Meteorologie und Geodynamik)</strong> (<a href="https://www.zamg.ac.at/">https://www.zamg.ac.at/</a>) – Wetter- und Klimadaten für Österreich.</li>



<li><strong>NOAA (National Oceanic and Atmospheric Administration)</strong> (<a href="https://www.ncdc.noaa.gov/">https://www.ncdc.noaa.gov/</a>) – Umfangreiche globale Messdaten.</li>



<li><strong>Copernicus Climate Data Store</strong> (<a href="https://cds.climate.copernicus.eu/">https://cds.climate.copernicus.eu/</a>) – Europäische Klimadaten und Langzeitmessungen.</li>



<li><strong>Netatmo Weather Map</strong> (<a href="https://weathermap.netatmo.com/">https://weathermap.netatmo.com/</a>) – Community-basierte Wetterstationen mit lokalen Messwerten weltweit.</li>



<li><strong>WOW (Weather Observations Website)</strong> (<a href="https://wow.metoffice.gov.uk/">https://wow.metoffice.gov.uk/</a>) – Eine Plattform zur Sammlung und Visualisierung von Wetterdaten aus lokalen Wetterstationen.</li>



<li><strong>Luftdaten.info</strong> (<a href="https://luftdaten.info/">https://luftdaten.info/</a>) – Community-Projekt für Feinstaub- und Wettermessungen in Deutschland.</li>
</ul>



<p class="wp-block-paragraph">Die meisten dieser Anbieter stellen eine API zur Verfügung, mit der Nutzer Messwerte in ihre Anwendungen integrieren können.</p>



<p class="wp-block-paragraph"><strong>Praktische Umsetzung: Ein Beispiel mit DWD Open Data</strong> Um Messwerte von Wetterstationen des DWD abzurufen, können Sie die Open-Data-Schnittstelle des DWD nutzen. Ein Beispiel für den Abruf der aktuellen Temperaturmessungen aus Deutschland mit Python:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="classic" data-enlighter-highlight="" data-enlighter-linenumbers="true" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import requests

URL = "https://opendata.dwd.de/climate_environment/CDC/observations_germany/climate/hourly/air_temperature/recent/stundenwerte_TU_00433_akt.zip"
response = requests.get(URL)

if response.status_code == 200:
    with open("stundenwerte_TU_00433_akt.zip", "wb") as file:
        file.write(response.content)
    print("Daten erfolgreich heruntergeladen.")
else:
    print("Fehler beim Abrufen der Messwerte. Bitte überprüfen Sie die URL oder die Stations-ID.")</pre>



<p class="wp-block-paragraph"><strong>Zusätzliche Umsetzung: Wetterdaten für eine Wohnadresse bestimmen</strong> Falls Sie Wetterdaten für eine spezifische Adresse benötigen, können Sie OpenStreetMap zur Geokodierung nutzen, um die Koordinaten zu bestimmen, und anschließend mit Open-Meteo oder anderen Diensten die nächstgelegene Wetterstation abfragen.</p>



<h3 class="wp-block-heading">Beispiel 1: Aktuelle Wetterdaten für eine Adresse</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="classic" data-enlighter-highlight="" data-enlighter-linenumbers="true" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import requests

def get_current_weather(address):
    geo_url = "https://nominatim.openstreetmap.org/search"
    params = {"q": address, "format": "json", "limit": 1}
    headers = {"User-Agent": "Wetterdaten-Skript/1.0 (kontakt@example.com)"}
    geo_response = requests.get(geo_url, params=params, headers=headers).json()

    if geo_response:
        lat, lon = geo_response[0]["lat"], geo_response[0]["lon"]
        weather_url = f"https://api.open-meteo.com/v1/forecast?latitude={lat}&amp;longitude={lon}&amp;current_weather=true"
        weather_response = requests.get(weather_url).json()
        print(f"Aktuelles Wetter für {address}: {weather_response['current_weather']}")
    else:
        print("Fehler beim Abrufen der Geodaten.")

get_current_weather("Kurfürstendamm 1, 10115 Berlin, Deutschland")</pre>



<h3 class="wp-block-heading">Beispiel 2: Historische Wetterdaten für eine Adresse und einen Zeitraum</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="classic" data-enlighter-highlight="" data-enlighter-linenumbers="true" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def get_historical_weather(address, start_date, end_date):
    geo_url = "https://nominatim.openstreetmap.org/search"
    params = {"q": address, "format": "json", "limit": 1}
    headers = {"User-Agent": "Wetterdaten-Skript/1.0 (kontakt@example.com)"}
    geo_response = requests.get(geo_url, params=params, headers=headers).json()

    if geo_response:
        lat, lon = geo_response[0]["lat"], geo_response[0]["lon"]
        weather_url = f"https://archive-api.open-meteo.com/v1/archive?latitude={lat}&amp;longitude={lon}&amp;start_date={start_date}&amp;end_date={end_date}&amp;daily=temperature_2m_max,temperature_2m_min"
        weather_response = requests.get(weather_url).json()
        print(f"Historische Wetterdaten für {address} vom {start_date} bis {end_date}: {weather_response}")
    else:
        print("Fehler beim Abrufen der Geodaten.")

get_historical_weather("Marienplatz, 80331 München, Deutschland", "2024-03-01", "2024-03-10")</pre>



<h3 class="wp-block-heading">Beispiel 3: aktuelle Temperatur mit Höhenangabe</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="classic" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import requests

# Schritt 1: Koordinaten für die Adresse abrufen
address = "Marienplatz, München, Deutschland"
geo_url = "https://nominatim.openstreetmap.org/search"
params = {
    "q": address,
    "format": "json",
    "limit": 1
}
headers = {
    "User-Agent": "Wetterdaten-Skript/1.0 (kontakt@example.com)"
}
geo_response = requests.get(geo_url, params=params, headers=headers).json()

if geo_response:
    lat = geo_response[0]["lat"]
    lon = geo_response[0]["lon"]
    print(f"Koordinaten für {address}: {lat}, {lon}")

    # Schritt 2: Wetterdaten für die Koordinaten abrufen
    weather_url = f"https://api.open-meteo.com/v1/forecast?latitude={lat}&amp;longitude={lon}&amp;current_weather=true"
    weather_response = requests.get(weather_url).json()

    if "elevation" in weather_response:
        ele = weather_response["elevation"]
        print(f"Höhe für {address}: {ele} m")
    
    if "current_weather" in weather_response:
        print(f"Aktuelle Temperatur: {weather_response['current_weather']['temperature']}°C")
    else:
        print("Keine Wetterdaten verfügbar.")
else:
    print("Fehler beim Abrufen der Geodaten.")
    
</pre>



<p class="wp-block-paragraph"><strong>Fazit</strong> Frei verfügbare Wetterdaten eröffnen eine Vielzahl an Möglichkeiten, sei es für die persönliche Nutzung, wissenschaftliche Forschung oder kommerzielle Anwendungen. Neben großen Wetterdiensten bieten auch Community-Projekte hyperlokale Wetterdaten an, die besonders für detaillierte Analysen nützlich sind. Durch einfache API-Abfragen lassen sich Messwerte von Wetterstationen in bestehende Systeme integrieren und vielseitig nutzen. Probieren Sie es aus und entdecken Sie die Potenziale freier Wetterdaten für Ihre eigenen Projekte!</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/software/freie-wetterdaten-nutzen-anwendungen-und-praktische-tipps/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">147</post-id>	</item>
		<item>
		<title>Morgens oder abends duschen? Finde deine perfekte Duschroutine!</title>
		<link>https://allround-blog.de/gesundheit/morgens-oder-abends-duschen-finde-deine-perfekte-duschroutine/</link>
					<comments>https://allround-blog.de/gesundheit/morgens-oder-abends-duschen-finde-deine-perfekte-duschroutine/#respond</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Mon, 31 Mar 2025 08:57:59 +0000</pubDate>
				<category><![CDATA[Gesundheit]]></category>
		<category><![CDATA[Wohlbefinden]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=144</guid>

					<description><![CDATA[Gehörst du auch zu denjenigen, die sich fragen, wann der beste Zeitpunkt für eine erfrischende Dusche ist? Ob du nun morgens unter die Brause springst, um wach und munter in den Tag zu starten, oder abends die Anspannung des Tages mit warmem Wasser abspülst – Duschen ist für viele ein tägliches Ritual für Hygiene und [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Gehörst du auch zu denjenigen, die sich fragen, wann der beste Zeitpunkt für eine erfrischende Dusche ist? Ob du nun morgens unter die Brause springst, um wach und munter in den Tag zu starten, oder abends die Anspannung des Tages mit warmem Wasser abspülst – Duschen ist für viele ein tägliches Ritual für Hygiene und Wohlbefinden. Doch wann ist der ideale Zeitpunkt für dich? Die Antwort ist nicht allgemeingültig und hängt ganz von deinen persönlichen Bedürfnissen, Vorlieben und Gewohnheiten ab. Lass uns gemeinsam die Vor- und Nachteile der Morgendusche und der Abenddusche beleuchten und dir wertvolle Tipps für ein gesundes und nachhaltiges Duscherlebnis geben.</p>



<h2 class="wp-block-heading">Die Morgendusche: Dein Frischekick für den Start in den Tag</h2>



<p class="wp-block-paragraph">Für viele ist die Dusche am Morgen der perfekte Wachmacher. Das kühle Nass, besonders bei etwas niedrigerer Temperatur, kann wahre Wunder wirken, um dich energiegeladen und fit zu fühlen. Kühleres Wasser setzt Adrenalin frei, was deine Aufmerksamkeit und Konzentration verbessern kann. Zudem wird die Blutzirkulation angeregt, was sowohl Körper als auch Geist belebt.</p>



<p class="wp-block-paragraph">Ein weiterer Pluspunkt der Morgendusche ist, dass du damit Schweiß und Talg abwäschst, die sich während der Nacht auf deiner Haut angesammelt haben können. Das ist besonders vorteilhaft für Menschen, die nachts stark schwitzen. Auch bei fettigen Haaren kann eine morgendliche Reinigung helfen, überschüssigen Talg zu entfernen und das Haar den ganzen Tag frisch aussehen zu lassen. Einige berichten sogar, dass sie unter der Morgendusche besonders klare Gedanken fassen und kreative Ideen entwickeln.</p>



<p class="wp-block-paragraph">Allerdings hat die Morgendusche auch ihre Kehrseite. Oft ist die Zeit am Morgen begrenzt, und eine ausgiebige Duschroutine passt möglicherweise nicht in den straffen Zeitplan. Zudem kann häufiges Duschen mit heißem Wasser, auch am Morgen, die Haut austrocknen und reizen, insbesondere wenn du zu trockener oder empfindlicher Haut neigst. Es gibt auch Hinweise aus der Forschung, dass kalte Duschen am Morgen auf nüchternen Magen möglicherweise zur Bildung eines schädlichen Nervengifts führen könnten, da die antioxidativen Reserven des Körpers zu dieser Zeit möglicherweise geringer sind.</p>



<h2 class="wp-block-heading">Die Abenddusche: Entspannung und Reinigung für eine erholsame Nacht</h2>



<p class="wp-block-paragraph">Die Dusche am Abend wird oft als ein wohltuendes Ritual empfunden, um den Tag hinter sich zu lassen. Sie befreit die Haut effektiv von Schweiß, Schmutz, Make-up und Umweltverschmutzungen, die sich im Laufe des Tages angesammelt haben. Das warme Wasser wirkt beruhigend auf angespannte Muskeln und kann helfen, Stress abzubauen. Eine warme Dusche vor dem Schlafengehen kann sogar die Schlafqualität verbessern, da sie den Körper entspannt und möglicherweise die Körpertemperatur leicht senkt, was dem Körper signalisiert, dass es Zeit zum Schlafen ist.</p>



<p class="wp-block-paragraph">Besonders Menschen mit trockener und empfindlicher Haut profitieren oft von einer abendlichen Dusche, da sich die natürliche Schutzbarriere der Haut über Nacht ohne die Reibung enger Kleidung besser regenerieren kann. Auch Pflegeprodukte haben über Nacht mehr Zeit, in die Haut einzuziehen. Die Abenddusche ist zudem ein idealer Zeitpunkt für die Rasur, da sich die Haut über Nacht erholen kann und eventuelle Rötungen bis zum nächsten Morgen abklingen. Allergiker können ebenfalls von einer abendlichen Dusche profitieren, da sie Pollen und andere Allergene von Haut und Haaren spült, die sich tagsüber angesammelt haben.</p>



<p class="wp-block-paragraph">Ein möglicher Nachteil der Abenddusche ist, dass sehr lange oder heiße Bäder auch hier zu trockener Haut führen können. Zudem vermissen manche Menschen das belebende Gefühl einer Morgendusche und fühlen sich nach dem Aufwachen möglicherweise nicht ganz so frisch.</p>



<h2 class="wp-block-heading">Individuelle Bedürfnisse und Hauttypen: Was ist für dich das Richtige?</h2>



<p class="wp-block-paragraph">Die beste Zeit und Art zu duschen hängt stark von deinem Hauttyp und deinen individuellen Bedürfnissen ab.</p>



<ul class="wp-block-list">
<li><strong>Trockene Haut:</strong> Hier wird oft eine Abenddusche mit lauwarmem Wasser empfohlen, damit sich die Feuchtigkeitsbarriere der Haut über Nacht erholen kann. Verwende milde, feuchtigkeitsspendende Reinigungsmittel und vermeide heißes Wasser sowie lange Duschgänge.</li>



<li><strong>Fettige Haut:</strong> Für fettige Haut kann eine Morgendusche vorteilhafter sein, um überschüssigen Talg abzuwaschen, der sich über Nacht gebildet hat. Auch hier ist lauwarmes Wasser empfehlenswert, um ein Austrocknen zu vermeiden, was paradoxerweise zu einer erhöhten Talgproduktion führen kann.</li>



<li><strong>Empfindliche Haut:</strong> Bei empfindlicher Haut wird oft eine Abenddusche mit lauwarmem Wasser empfohlen, um Reizungen zu minimieren. Wähle parfümfreie und milde Reinigungsmittel.</li>



<li><strong>Allergien:</strong> Wenn du unter Allergien leidest, kann eine abendliche Dusche helfen, Allergene wie Pollen von deiner Haut und deinen Haaren zu entfernen.</li>



<li><strong>Nächtliches Schwitzen:</strong> Bei starkem nächtlichem Schwitzen kann eine Morgendusche angenehmer sein, um dich frisch für den Tag zu fühlen.</li>
</ul>



<p class="wp-block-paragraph">Berücksichtige auch deinen Lebensstil. Benötigst du morgens einen Frischekick, oder legst du mehr Wert auf Entspannung am Abend? Wie aktiv bist du und wie stark schwitzt du? Probiere verschiedene Routinen aus, um herauszufinden, was für dich am besten funktioniert. Es gibt keine allgemeingültige Antwort.</p>



<h2 class="wp-block-heading">Tipps für ein optimales Duscherlebnis</h2>



<p class="wp-block-paragraph">Unabhängig davon, wann du duschst, gibt es einige wichtige Punkte zu beachten, um deine Haut zu schonen und gleichzeitig nachhaltig mit Wasser umzugehen:</p>



<ul class="wp-block-list">
<li><strong>Wassertemperatur:</strong> Dusche mit lauwarmem Wasser (32-38°C) und vermeide zu heißes Wasser.</li>



<li><strong>Dauer:</strong> Halte deine Duschen kurz, idealerweise zwischen 5 und 10 Minuten.</li>



<li><strong>Reinigungsmittel:</strong> Verwende milde, pH-neutrale Duschgele oder Syndets anstelle von aggressiven Seifen. Nutze sie nur an den Körperstellen, wo es wirklich notwendig ist.</li>



<li><strong>Häufigkeit:</strong> Dusche nicht zu oft. Alle zwei oder drei Tage können für die grundlegende Hygiene ausreichen, es sei denn, du bist stark verschwitzt oder schmutzig. Tägliches Duschen ist in Ordnung, aber vermeide es, mehrmals täglich zu duschen.</li>



<li><strong>Nach dem Duschen:</strong> Tupfe deine Haut sanft trocken und trage eine feuchtigkeitsspendende Lotion auf, besonders wenn du trockene Haut hast.</li>



<li><strong>Haare waschen:</strong> Wasche deine Haare nicht jeden Tag, um ein Austrocknen der Kopfhaut zu vermeiden.</li>



<li><strong>Nachhaltigkeit:</strong> Achte auf einen geringen Wasserverbrauch und erwäge die Anschaffung eines Sparduschkopfes. Reduziere den Wasserdruck und seife nur die notwendigen Bereiche ein. Ein herkömmlicher Duschkopf verbraucht etwa 15 Liter pro Minute, während ein Sparduschkopf nur etwa 8 Liter benötigt.</li>
</ul>



<h2 class="wp-block-heading">Fazit: Finde deine ideale Duschroutine</h2>



<p class="wp-block-paragraph">Ob du dich nun für die belebende Morgendusche oder die entspannende Abenddusche entscheidest, ist letztendlich eine sehr persönliche Angelegenheit. Beide Zeitpunkte haben ihre Vor- und Nachteile. Achte auf die Signale deiner Haut und berücksichtige deine individuellen Bedürfnisse. Experimentiere mit verschiedenen Routinen und finde heraus, was sich für dich am besten anfühlt und optimal in deinen Alltag passt. So wird deine tägliche Dusche zu einem Wohlfühlmoment, der deiner Haut guttut und gleichzeitig die Umwelt schont.</p>



<h2 class="wp-block-heading">Weiterführende Links</h2>



<ul class="wp-block-list">
<li><a href="https://www.sat1.de/serien/fruehstuecksfernsehen/news/koerper-hygiene-warm-oder-kalt-duschen-und-besser-morgens-oder-abends-83014" target="_blank" rel="noopener">Morgens oder abends duschen? Das solltest du bei Hitze im Sommer tun</a></li>



<li><a href="https://www.calmwaters.de/ratgeber/die-richtige-temperatur-beim-duschen" target="_blank" rel="noopener">Die richtige Temperatur beim Duschen</a></li>



<li><a href="https://www.nivea.de/beratung/schoene-haut/wie-oft-sollte-man-duschen" target="_blank" rel="noopener">Wie oft sollte man duschen? | Hautpflegetipps</a></li>



<li><a href="https://utopia.de/ratgeber/abends-oder-morgens-duschen-das-solltest-du-wissen_384646/" target="_blank" rel="noopener">Abends oder morgens duschen – Das solltest du wissen</a></li>



<li><a href="https://www.fitforfun.de/beauty/kalt-warm-oder-im-wechsel-welche-duschtemperatur-ist-am-besten-196651.html" target="_blank" rel="noopener">Kalt, warm oder im Wechsel: Welche Duschtemperatur ist am besten?</a></li>
</ul>



<p class="wp-block-paragraph"><br>
</p>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/gesundheit/morgens-oder-abends-duschen-finde-deine-perfekte-duschroutine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">144</post-id>	</item>
		<item>
		<title>Frühling auf der Alb: Die Grünlandtemperatursumme als Kompass für Imker</title>
		<link>https://allround-blog.de/imkerei/gruenlandtemperatursumme-und-ihre-bedeutung-fuer-die-imkerei/</link>
					<comments>https://allround-blog.de/imkerei/gruenlandtemperatursumme-und-ihre-bedeutung-fuer-die-imkerei/#comments</comments>
		
		<dc:creator><![CDATA[Heinrich Schewe]]></dc:creator>
		<pubDate>Thu, 27 Mar 2025 15:19:17 +0000</pubDate>
				<category><![CDATA[Imkerei]]></category>
		<category><![CDATA[Bienen]]></category>
		<category><![CDATA[Phänologischer Kalender]]></category>
		<guid isPermaLink="false">https://allround-blog.de/?p=128</guid>

					<description><![CDATA[Der Frühling auf der Schwäbischen Alb ist eine besondere Zeit. Nach oft langen und manchmal rauen Wintern erwacht die Natur sichtbar zu neuem Leben. Für uns Imkerinnen und Imker bedeutet das den Start in die aktivste Phase des Bienenjahres. Doch wann ist der richtige Zeitpunkt für welche Maßnahmen am Bienenstand? Wann lösen sich die Wintertrauben [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Der Frühling auf der Schwäbischen Alb ist eine besondere Zeit. Nach oft langen und manchmal rauen Wintern erwacht die Natur sichtbar zu neuem Leben. Für uns Imkerinnen und Imker bedeutet das den Start in die aktivste Phase des Bienenjahres. Doch wann ist der richtige Zeitpunkt für welche Maßnahmen am Bienenstand? Wann lösen sich die Wintertrauben auf? Wann beginnt der erste große Polleneintrag? Ein wertvoller Indikator, der uns hier Orientierung gibt, ist die Grünlandtemperatursumme (GTS).</p>



<h3 class="wp-block-heading">Was ist die Grünlandtemperatursumme (GTS)?</h3>



<p class="wp-block-paragraph">Die Grünlandtemperatursumme, oft auch einfach GTS genannt, ist eine Kenngröße aus der Agrarmeteorologie. Sie beschreibt den kumulierten Wärmeeffekt auf das Pflanzenwachstum im Frühjahr. Vereinfacht gesagt, werden ab dem 1. Januar eines Jahres alle positiven Tagesmitteltemperaturen (der Durchschnitt aus Höchst- und Tiefsttemperatur eines Tages) aufsummiert. Liegt die Tagesmitteltemperatur unter 0°C, wird für diesen Tag 0°C zur Summe addiert.</p>



<p class="wp-block-paragraph">Ein wichtiger Schwellenwert ist dabei die <strong>200-Grad-Marke</strong>. Das Erreichen dieser Summe wird oft als der phänologische Vegetationsbeginn angesehen – der Zeitpunkt, ab dem das Gras auf den Wiesen nachhaltig zu wachsen beginnt.</p>



<h3 class="wp-block-heading">Warum ist die GTS für Imker auf der Schwäbischen Alb relevant?</h3>



<p class="wp-block-paragraph">Die Entwicklung der Bienenvölker im Frühjahr ist stark temperaturabhängig. Die GTS gibt uns Imkern einen relativ verlässlichen Anhaltspunkt, wann bestimmte Entwicklungsstadien bei den Bienen und in der Natur erreicht werden – oft genauer als der reine Kalendertag, gerade in einer Region wie der Schwäbischen Alb, wo das Frühjahr aufgrund der Höhenlage oft etwas später einsetzt als im Tal.</p>



<ul class="wp-block-list">
<li><strong>Erste Ausflüge &amp; Reinigungsflug:</strong> Schon vor Erreichen der 200-Grad-Marke, an sonnigen Tagen mit Temperaturen über ca. 10-12°C, finden erste kurze Ausflüge und der wichtige Reinigungsflug statt.</li>



<li><strong>Beginn des Polleneintrags:</strong> Das Erreichen der <strong>200-Grad-Marke</strong> korreliert oft gut mit dem Beginn der Blüte wichtiger früher Pollenspender wie Salweide und Hasel. Dieser erste massive Polleneintrag ist der Startschuss für die Königin, die Eilage deutlich zu erhöhen und das Brutnest massiv zu erweitern.</li>



<li><strong>Volksentwicklung:</strong> Die steigende GTS signalisiert uns, dass die Völker nun verstärkt brüten und wachsen. Dies ist entscheidend für die Planung von Maßnahmen wie:
<ul class="wp-block-list">
<li>Kontrolle der Futterreserven (Brut kostet viel Energie!)</li>



<li>Erste kurze Durchsicht bei geeignetem Wetter (über 15°C, windstill)</li>



<li>Gegebenenfalls Erweiterung des Brutraums</li>
</ul>
</li>



<li><strong>Trachtbeginn:</strong> Spätere GTS-Werte können Hinweise auf den Blühbeginn wichtiger Trachten wie Obstblüte (Kirsche, Apfel auf den Streuobstwiesen der Alb!) oder später Raps geben. Das hilft bei der Entscheidung, wann die Honigräume aufgesetzt werden müssen.</li>
</ul>



<h3 class="wp-block-heading">Wo finde ich aktuelle GTS-Werte für die Schwäbische Alb?</h3>



<p class="wp-block-paragraph">Die GTS ist kein statischer Wert, sondern entwickelt sich täglich weiter. Aktuelle Werte und Prognosen sind daher Gold wert. Hier gibt es verschiedene Quellen:</p>



<ul class="wp-block-list">
<li><strong>Agrarmeteorologische Dienste:</strong> Landesanstalten oder Wetterdienste (z.B. DWD, LAZBW) bieten oft regionale Agrarwetterdaten an, manchmal inklusive der GTS für verschiedene Stationen.</li>



<li><strong>Lokale Wetterstationen:</strong> Private oder halböffentliche Wetterstationen in der Region können ebenfalls zur Berechnung herangezogen werden.</li>



<li><strong>Imkerliche Plattformen und Netzwerke:</strong> Hier kommt auch <strong><a href="https://beelot.de/" target="_blank" rel="noreferrer noopener">beelot.de</a></strong> ins Spiel. Solche Plattformen bündeln oft relevante Informationen für Imker, darunter Wetterdaten, Trachtbeobachtungen und phänologische Daten aus der Community. Es lohnt sich, auf solchen Portalen nach regionalen Daten oder Erfahrungswerten von Kollegen aus der Schwäbischen Alb zu suchen oder diese selbst beizusteuern. Sie können eine wertvolle Ergänzung zu den offiziellen Wetterdaten sein, da sie oft sehr standortnah sind.</li>
</ul>



<h3 class="wp-block-heading">Fazit: Die GTS als nützlicher Helfer</h3>



<p class="wp-block-paragraph">Die Grünlandtemperatursumme ist kein Allheilmittel und ersetzt nicht die genaue Beobachtung am Bienenstand und in der Natur. Aber sie ist ein wertvolles Werkzeug, um die Entwicklung im Frühjahr besser einzuschätzen und imkerliche Maßnahmen auf der Schwäbischen Alb besser zu planen. Gerade weil das Wetter hier manchmal seine eigenen Regeln hat, hilft uns die GTS, den tatsächlichen biologischen Startpunkt des Frühlings zu erkennen.</p>



<p class="wp-block-paragraph">Nutzt die verfügbaren Daten, tauscht euch mit Imkerkollegen aus (vielleicht ja über Plattformen wie <a href="https://beelot.de/" target="_blank" rel="noreferrer noopener">beelot.de</a>) und beobachtet eure Bienen und die erwachende Natur auf unserer schönen Alb. Ich wünsche euch allen einen guten Start in die Bienensaison 2025!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Wie nutzt ihr die Grünlandtemperatursumme oder andere Indikatoren für eure Imkerei auf der Schwäbischen Alb? Teilt eure Erfahrungen gerne in den Kommentaren!</em></p>



<h3 class="wp-block-heading">Weiter führende Links:</h3>



<ul class="wp-block-list">
<li><a href="https://cbrell.de/blog/gruenlandtemperatursumme-phaenologischer-kalender-und-bienen-bedeutung-der-temperatur-fuer-die-imkerei/">https://cbrell.de/blog/gruenlandtemperatursumme-phaenologischer-kalender-und-bienen-bedeutung-der-temperatur-fuer-die-imkerei/</a></li>



<li><a href="https://forum.hivewatch.net/t/neue-funktion-gruenland-temperatursumme/383">https://forum.hivewatch.net/t/neue-funktion-gruenland-temperatursumme/383</a></li>



<li><a href="https://www.beelot.de/index.html">https://www.beelot.de/index.html</a></li>



<li><a href="https://www.mostbee.at/grunlandtemperaturleicht-erklart-vorhersage-der-baumblute-im-fruhling/">https://www.mostbee.at/grunlandtemperaturleicht-erklart-vorhersage-der-baumblute-im-fruhling/</a></li>



<li><a href="https://www.youtube.com/watch?v=3Gg22uFl-Bo">https://www.youtube.com/watch?v=3Gg22uFl-Bo</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://allround-blog.de/imkerei/gruenlandtemperatursumme-und-ihre-bedeutung-fuer-die-imkerei/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">128</post-id>	</item>
	</channel>
</rss>
