<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bestaoui Aymen</title>
    <description>The latest articles on DEV Community by Bestaoui Aymen (@bestaoui_aymen).</description>
    <link>https://dev.to/bestaoui_aymen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3361350%2F44ee40d3-5b7b-42a6-8f9e-db47d7509c21.png</url>
      <title>DEV Community: Bestaoui Aymen</title>
      <link>https://dev.to/bestaoui_aymen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bestaoui_aymen"/>
    <language>en</language>
    <item>
      <title>FlexColorScheme in Flutter: The Smarter Way to Theme Your Apps</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Sun, 05 Oct 2025 10:51:25 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/flexcolorscheme-in-flutter-the-smarter-way-to-theme-your-apps-3fml</link>
      <guid>https://dev.to/bestaoui_aymen/flexcolorscheme-in-flutter-the-smarter-way-to-theme-your-apps-3fml</guid>
      <description>&lt;p&gt;Designing a consistent and beautiful theme for your Flutter app can be tricky. While the built-in &lt;code&gt;ThemeData&lt;/code&gt; is powerful, it often requires a lot of boilerplate code to achieve polished results—especially if you want your app to look great in both light and dark modes.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;FlexColorScheme&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is FlexColorScheme?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FlexColorScheme&lt;/strong&gt; is a Flutter package that makes it easy to create and manage themes for your app. It builds on top of Flutter’s theming system (&lt;code&gt;ThemeData&lt;/code&gt; and &lt;code&gt;ColorScheme&lt;/code&gt;) but adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Predefined color schemes&lt;/strong&gt;: Over 50 ready-made themes inspired by real-world apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Light &amp;amp; dark variants&lt;/strong&gt;: Auto-generate matching dark mode versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible customization&lt;/strong&gt;: Adjust tones, surface colors, and component styles with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material 3 ready&lt;/strong&gt;: Supports Material You dynamic color features out of the box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of writing hundreds of lines of &lt;code&gt;ThemeData&lt;/code&gt;, you can define your whole theme in just a few lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use FlexColorScheme?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Save Time&lt;/strong&gt;
Stop manually tweaking every widget’s color—FlexColorScheme does the heavy lifting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;
Light and dark modes stay perfectly in sync.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material 3 Support&lt;/strong&gt;
Your app can adopt system-wide dynamic colors on Android 12+.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customizable Yet Simple&lt;/strong&gt;
You can start with presets, then fine-tune them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Add it to your &lt;code&gt;pubspec.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;flex_color_scheme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^8.3.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flex_color_scheme/flex_color_scheme.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example: Quick Theming
&lt;/h2&gt;

&lt;p&gt;Here’s how you can set up light and dark themes in just a few lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;FlexThemeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;scheme:&lt;/span&gt; &lt;span class="n"&gt;FlexScheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mango&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;darkTheme:&lt;/span&gt; &lt;span class="n"&gt;FlexThemeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;scheme:&lt;/span&gt; &lt;span class="n"&gt;FlexScheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mango&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;themeMode:&lt;/span&gt; &lt;span class="n"&gt;ThemeMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Switches based on device setting&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;MyHomePage&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it—you now have a fully styled app with both light and dark themes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Custom Color Scheme
&lt;/h2&gt;

&lt;p&gt;If you want more control, you can create your own custom scheme:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;myScheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FlexSchemeData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'My Custom Theme'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;description:&lt;/span&gt; &lt;span class="s"&gt;'A blue and orange color scheme'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;light:&lt;/span&gt; &lt;span class="n"&gt;FlexSchemeColor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;primary:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;secondary:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orange&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nl"&gt;dark:&lt;/span&gt; &lt;span class="n"&gt;FlexSchemeColor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;primary:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;shade200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;secondary:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;shade200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then apply it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;FlexThemeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;colors:&lt;/span&gt; &lt;span class="n"&gt;myScheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="nl"&gt;darkTheme:&lt;/span&gt; &lt;span class="n"&gt;FlexThemeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;colors:&lt;/span&gt; &lt;span class="n"&gt;myScheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bonus: Material 3 Dynamic Colors
&lt;/h2&gt;

&lt;p&gt;If you want your app to match the system theme on Android 12+:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;FlexThemeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;useMaterial3:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;useMaterial3ErrorColors:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="nl"&gt;darkTheme:&lt;/span&gt; &lt;span class="n"&gt;FlexThemeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;useMaterial3:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;useMaterial3ErrorColors:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your app will automatically adapt to the user’s wallpaper colors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with presets&lt;/strong&gt;: Use a predefined scheme to get going quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Override selectively&lt;/strong&gt;: Only customize colors you need to change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test in dark mode&lt;/strong&gt;: Ensure both light and dark look great together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Material 3&lt;/strong&gt;: Future-proof your app with dynamic color support.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>themes</category>
    </item>
    <item>
      <title>How to Create Reusable Custom Widgets for Your Flutter Projects 🛠️</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Thu, 02 Oct 2025 07:30:45 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/how-to-create-reusable-custom-widgets-for-your-flutter-projects-15id</link>
      <guid>https://dev.to/bestaoui_aymen/how-to-create-reusable-custom-widgets-for-your-flutter-projects-15id</guid>
      <description>&lt;p&gt;One of Flutter’s biggest strengths is its widget-based architecture. Everything in Flutter — from buttons to layouts — is a widget. But if you’re building apps regularly, you’ll quickly notice a pattern: you keep writing the same UI code again and again.&lt;/p&gt;

&lt;p&gt;That’s where custom reusable widgets come in. They make your code cleaner, reduce duplication, and ensure consistency across your project. In this blog, we’ll explore how to create reusable widgets in Flutter — step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Reusable Widgets Matter 🤔
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt; → Same UI style across multiple screens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt; → Change code in one place, update everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productivity&lt;/strong&gt; → Write once, use everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; → Makes your app easier to grow and refactor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example 1: A Custom Button Widget 🔘
&lt;/h2&gt;

&lt;p&gt;Instead of rewriting ElevatedButton with styling each time, wrap it into a reusable widget.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppButton&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;VoidCallback&lt;/span&gt; &lt;span class="n"&gt;onPressed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;AppButton&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onPressed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;key:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;styleFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;backgroundColor:&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;shape:&lt;/span&gt; &lt;span class="n"&gt;RoundedRectangleBorder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;borderRadius:&lt;/span&gt; &lt;span class="n"&gt;BorderRadius&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;circular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;padding:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;EdgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;symmetric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;horizontal:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;vertical:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="n"&gt;onPressed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;AppButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;label:&lt;/span&gt; &lt;span class="s"&gt;"Get Started"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Clicked!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example 2: Custom Input Field ✏️
&lt;/h2&gt;

&lt;p&gt;TextFields are common, but they often need custom styling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppTextField&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;hint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;TextEditingController&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isPassword&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;AppTextField&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;key:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;controller:&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;obscureText:&lt;/span&gt; &lt;span class="n"&gt;isPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;decoration:&lt;/span&gt; &lt;span class="n"&gt;InputDecoration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;hintText:&lt;/span&gt; &lt;span class="n"&gt;hint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;border:&lt;/span&gt; &lt;span class="n"&gt;OutlineInputBorder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;borderRadius:&lt;/span&gt; &lt;span class="n"&gt;BorderRadius&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;circular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;contentPadding:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;EdgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;AppTextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;hint:&lt;/span&gt; &lt;span class="s"&gt;"Enter your email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;controller:&lt;/span&gt; &lt;span class="n"&gt;TextEditingController&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example 3: Combining Widgets Into a Card 📦
&lt;/h2&gt;

&lt;p&gt;Reusable widgets aren’t just for single components — you can build complex UI blocks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InfoCard&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;IconData&lt;/span&gt; &lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;InfoCard&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;key:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;shape:&lt;/span&gt; &lt;span class="n"&gt;RoundedRectangleBorder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;borderRadius:&lt;/span&gt; &lt;span class="n"&gt;BorderRadius&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;circular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;ListTile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;leading:&lt;/span&gt; &lt;span class="n"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;size:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="nl"&gt;subtitle:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;InfoCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;"Profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;subtitle:&lt;/span&gt; &lt;span class="s"&gt;"View and edit your profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;icon:&lt;/span&gt; &lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro Tips for Creating Reusable Widgets 💡
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep them flexible&lt;/strong&gt; → Use parameters for customization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow naming conventions&lt;/strong&gt; → AppButton, AppCard, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use composition&lt;/strong&gt; → Build big widgets by combining small ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid over-engineering&lt;/strong&gt; → Don’t create a widget for every line of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralize them&lt;/strong&gt; → Store your reusable widgets in a /widgets folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By doing this, you’ll write less code, ship faster, and your apps will look much more polished. 🚀&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Why ListView Can Hurt Your App’s Performance (and What to Use Instead) ⚡</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Tue, 30 Sep 2025 07:07:16 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/why-listview-can-hurt-your-apps-performance-and-what-to-use-instead-1dbc</link>
      <guid>https://dev.to/bestaoui_aymen/why-listview-can-hurt-your-apps-performance-and-what-to-use-instead-1dbc</guid>
      <description>&lt;p&gt;If you’ve been building Flutter apps for a while, you’ve probably used ListView countless times. It’s one of the most common widgets for displaying scrollable content. But here’s the catch: not all ListViews are created equal, and if you’re not careful, they can absolutely tank your app’s performance.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll break down why ListView can be bad for performance, common mistakes developers make, and what you should use instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Problem With Default ListView 🛑
&lt;/h2&gt;

&lt;p&gt;By default, ListView tries to build all of its children at once.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you have 1000 items, Flutter will render all 1000 widgets immediately.&lt;/li&gt;
&lt;li&gt;This leads to laggy scrolling, high memory usage, and dropped frames.&lt;/li&gt;
&lt;li&gt;On older devices, the app may even crash due to memory pressure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The Hidden Cost of Widgets 💸
&lt;/h2&gt;

&lt;p&gt;Every widget in Flutter comes with a rendering cost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you use &lt;code&gt;ListView(children: [...])&lt;/code&gt;, all items are kept in memory.&lt;/li&gt;
&lt;li&gt;Flutter has to calculate layouts, paint objects, and handle gestures for each.&lt;/li&gt;
&lt;li&gt;As your list grows, performance drops exponentially.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it this way: showing 10 cards is fine. Showing 10,000? That’s a nightmare.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Common Mistakes Developers Make ❌
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Using &lt;code&gt;ListView(children: [...])&lt;/code&gt; instead of a builder.&lt;/li&gt;
&lt;li&gt;Nesting multiple ListViews (leading to unbounded rendering).&lt;/li&gt;
&lt;li&gt;Placing heavy widgets (images, charts) without lazy loading.&lt;/li&gt;
&lt;li&gt;Forgetting to use caching for images in long lists.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. The Right Way: ListView.builder ✅
&lt;/h2&gt;

&lt;p&gt;Flutter provides builder constructors that render items lazily:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;itemCount:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;itemBuilder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ListTile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Item &lt;/span&gt;&lt;span class="si"&gt;$index&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Only the visible items + a few off-screen buffers are built.&lt;br&gt;&lt;br&gt;
✅ As you scroll, Flutter recycles widgets.&lt;br&gt;&lt;br&gt;
✅ Memory and CPU usage remain stable.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. For Complex Scenarios: ListView.separated &amp;amp; Slivers 🧩
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ListView.separated&lt;/code&gt;&lt;/strong&gt; → Great when you need dividers between items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;CustomScrollView + SliverList&lt;/code&gt;&lt;/strong&gt; → Perfect for advanced layouts (sticky headers, grids, mixed content).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 &lt;strong&gt;Example with SliverList:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;CustomScrollView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;slivers:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;SliverList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;delegate:&lt;/span&gt; &lt;span class="n"&gt;SliverChildBuilderDelegate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ListTile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Item &lt;/span&gt;&lt;span class="si"&gt;$index&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="nl"&gt;childCount:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Performance Tips for Lists ⚡
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;ListView.builder&lt;/code&gt; or &lt;code&gt;SliverList&lt;/code&gt; for long/unknown lists.&lt;/li&gt;
&lt;li&gt;Wrap heavy widgets (like images) with &lt;code&gt;CachedNetworkImage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;const&lt;/code&gt; constructors whenever possible.&lt;/li&gt;
&lt;li&gt;Avoid deep widget trees inside list items.&lt;/li&gt;
&lt;li&gt;Consider pagination or infinite scrolling if your data set is huge.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>list</category>
    </item>
    <item>
      <title>How to Brand Your Flutter Apps Like a Pro 🚀</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Sun, 28 Sep 2025 14:28:34 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/how-to-brand-your-flutter-apps-like-a-pro-3e32</link>
      <guid>https://dev.to/bestaoui_aymen/how-to-brand-your-flutter-apps-like-a-pro-3e32</guid>
      <description>&lt;p&gt;Building apps with Flutter isn’t just about writing clean code — it’s also about crafting an experience that users remember. Strong branding makes your app stand out, communicates trust, and keeps users coming back. Whether your project is a personal side hustle or a large-scale product, investing in branding is what separates “just another app” from one that feels polished and professional.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll show you how to brand your Flutter apps like a pro — step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Define Your Brand Identity 🎯
&lt;/h2&gt;

&lt;p&gt;Before you dive into code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App Name &amp;amp; Logo&lt;/strong&gt; → Keep it short, memorable, and relevant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brand Values&lt;/strong&gt; → What emotions do you want to spark (trust, fun, productivity)?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice &amp;amp; Tone&lt;/strong&gt; → Will your app speak formally, casually, or playfully?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;Pro tip:&lt;/strong&gt; Write a mini style guide with your logo, colors, fonts, and brand rules. It’ll save you headaches later.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Craft a Visual Language 🎨
&lt;/h2&gt;

&lt;p&gt;Flutter makes it simple to apply consistent design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Colors&lt;/strong&gt; → Stick to 3–5 main colors. Tools like &lt;a href="https://coolors.co" rel="noopener noreferrer"&gt;Coolors&lt;/a&gt; can help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography&lt;/strong&gt; → Use 1–2 fonts max. A bold font for headings + a clean font for body text works well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Icons&lt;/strong&gt; → Keep them consistent (outlined, filled, or rounded).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 &lt;strong&gt;Example theme in Flutter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;appTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ThemeData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;primaryColor:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF2196F3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nl"&gt;fontFamily:&lt;/span&gt; &lt;span class="s"&gt;'Poppins'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;textTheme:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TextTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;headlineMedium:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nl"&gt;bodyMedium:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Build a Design System 📐
&lt;/h2&gt;

&lt;p&gt;Don’t repeat yourself. Create reusable branded widgets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buttons (primary, secondary, outlined).&lt;/li&gt;
&lt;li&gt;Text fields with your brand’s borders and padding.&lt;/li&gt;
&lt;li&gt;Cards and list items with your signature style.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps everything looking consistent and saves time as your app grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add Animations for Personality ✨
&lt;/h2&gt;

&lt;p&gt;A static app feels lifeless — animations give it a soul:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smooth page transitions (PageRouteBuilder).&lt;/li&gt;
&lt;li&gt;Fun micro-interactions (button bounce, subtle fades).&lt;/li&gt;
&lt;li&gt;A branded splash animation with your logo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use tools like &lt;a href="https://rive.app" rel="noopener noreferrer"&gt;Rive&lt;/a&gt; or &lt;a href="https://lottiefiles.com" rel="noopener noreferrer"&gt;Lottie&lt;/a&gt; to integrate professional animations.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Brand Your App Store Presence 🏪
&lt;/h2&gt;

&lt;p&gt;Branding extends beyond the app itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App Icon&lt;/strong&gt; → Simple, recognizable, scalable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshots&lt;/strong&gt; → Add captions and highlight key features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Description&lt;/strong&gt; → Write it in your brand’s voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviews &amp;amp; Replies&lt;/strong&gt; → Stay consistent, even when responding to users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Extend Branding Beyond the App 🌍
&lt;/h2&gt;

&lt;p&gt;Pro apps carry branding across every user touchpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Onboarding flows.&lt;/li&gt;
&lt;li&gt;Push notifications (keep them on-brand).&lt;/li&gt;
&lt;li&gt;Website &amp;amp; social media pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything should feel like part of the same story.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Keep Improving 🔄
&lt;/h2&gt;

&lt;p&gt;Branding isn’t “set it and forget it.” Gather feedback, watch trends, and evolve your style to stay relevant.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>design</category>
    </item>
    <item>
      <title>GoRouter for Flutter Web: Building a URL-Friendly App</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Thu, 18 Sep 2025 14:27:40 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/gorouter-for-flutter-web-building-a-url-friendly-app-e0n</link>
      <guid>https://dev.to/bestaoui_aymen/gorouter-for-flutter-web-building-a-url-friendly-app-e0n</guid>
      <description>&lt;h2&gt;
  
  
  Why GoRouter for Flutter Web?
&lt;/h2&gt;

&lt;p&gt;GoRouter, developed by the Flutter team, is designed to handle navigation with a URL-based approach, making it ideal for web apps. Here’s why GoRouter shines for Flutter web development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL-Based Navigation&lt;/strong&gt;: GoRouter supports clean URLs (e.g., &lt;code&gt;/about&lt;/code&gt;, &lt;code&gt;/product/123&lt;/code&gt;), which align with how users expect web navigation to work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser Integration&lt;/strong&gt;: It handles browser back/forward buttons and URL changes seamlessly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Linking&lt;/strong&gt;: Users can share or bookmark specific pages (e.g., &lt;code&gt;/product/42&lt;/code&gt;) and land directly on them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declarative Routing&lt;/strong&gt;: Define routes in a straightforward, scalable way, reducing navigation complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this guide, we’ll build a simple Flutter web app with GoRouter, featuring a Home page, an About page, and a Product page with dynamic URLs. We’ll ensure the app supports browser navigation and deep linking, all while keeping the code beginner-friendly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up the Project
&lt;/h2&gt;

&lt;p&gt;Let’s create a Flutter web app with GoRouter step by step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a New Flutter Project
&lt;/h3&gt;

&lt;p&gt;If you don’t already have a Flutter project, create one by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter create go_router_web_app
&lt;span class="nb"&gt;cd &lt;/span&gt;go_router_web_app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure your Flutter SDK is set up for web development. Test it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter run &lt;span class="nt"&gt;-d&lt;/span&gt; chrome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Add GoRouter Dependency
&lt;/h3&gt;

&lt;p&gt;Add the &lt;code&gt;go_router&lt;/code&gt; package to your project. Open &lt;code&gt;pubspec.yaml&lt;/code&gt; and include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;go_router&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^16.2.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;flutter pub get&lt;/code&gt; to install it. (Check &lt;a href="https://pub.dev/packages/go_router" rel="noopener noreferrer"&gt;pub.dev&lt;/a&gt; for the latest version.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create the App Screens
&lt;/h3&gt;

&lt;p&gt;Let’s create three simple screens: &lt;code&gt;HomeScreen&lt;/code&gt;, &lt;code&gt;AboutScreen&lt;/code&gt;, and &lt;code&gt;ProductScreen&lt;/code&gt;. Create a &lt;code&gt;lib/screens&lt;/code&gt; folder and add the following files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;lib/screens/home_screen.dart&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:go_router/go_router.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Home'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span class="n"&gt;MainAxisAlignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Welcome to the Home Page!'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/about'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Go to About'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/product/123'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'View Product #123'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;lib/screens/about_screen.dart&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:go_router/go_router.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AboutScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;AboutScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'About'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span class="n"&gt;MainAxisAlignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'About Our App'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Back to Home'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;lib/screens/product_screen.dart&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:go_router/go_router.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ProductScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Product #&lt;/span&gt;&lt;span class="si"&gt;$productId&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span class="n"&gt;MainAxisAlignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Details for Product #&lt;/span&gt;&lt;span class="si"&gt;$productId&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Back to Home'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Set Up GoRouter
&lt;/h3&gt;

&lt;p&gt;Now, configure GoRouter to handle navigation. Replace the contents of &lt;code&gt;lib/main.dart&lt;/code&gt; with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:go_router/go_router.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'screens/home_screen.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'screens/about_screen.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'screens/product_screen.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Define the GoRouter configuration&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;GoRouter&lt;/span&gt; &lt;span class="n"&gt;_router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GoRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;initialLocation:&lt;/span&gt; &lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Start at the home page&lt;/span&gt;
    &lt;span class="nl"&gt;routes:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/about'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;AboutScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/product/:productId'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pathParameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'productId'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ProductScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;productId:&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="c1"&gt;// Optional: Handle 404-like errors&lt;/span&gt;
    &lt;span class="nl"&gt;errorBuilder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Page Not Found'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span class="n"&gt;MainAxisAlignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Error: &lt;/span&gt;&lt;span class="si"&gt;${state.error}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Go to Home'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'Flutter GoRouter Web Demo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;routerConfig:&lt;/span&gt; &lt;span class="n"&gt;_router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;ThemeData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;primarySwatch:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explanation of the Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GoRouter Setup&lt;/strong&gt;: We define three routes:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/&lt;/code&gt;: Maps to &lt;code&gt;HomeScreen&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/about&lt;/code&gt;: Maps to &lt;code&gt;AboutScreen&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/product/:productId&lt;/code&gt;: Maps to &lt;code&gt;ProductScreen&lt;/code&gt;, with a dynamic &lt;code&gt;productId&lt;/code&gt; parameter.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;MaterialApp.router&lt;/strong&gt;: This integrates GoRouter with Flutter’s navigation system.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Error Handling&lt;/strong&gt;: The &lt;code&gt;errorBuilder&lt;/code&gt; displays a custom 404 page if the user navigates to an invalid route (e.g., &lt;code&gt;/invalid&lt;/code&gt;).&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Navigation&lt;/strong&gt;: We use &lt;code&gt;context.go()&lt;/code&gt; for navigation, which updates the browser’s URL and supports back/forward buttons.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 5: Run the App for Web
&lt;/h3&gt;

&lt;p&gt;Run the app in a browser with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter run &lt;span class="nt"&gt;-d&lt;/span&gt; chrome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Home page with buttons to navigate to the About page or Product page.&lt;/li&gt;
&lt;li&gt;URLs in the browser change to &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;/about&lt;/code&gt;, or &lt;code&gt;/product/123&lt;/code&gt; as you navigate.&lt;/li&gt;
&lt;li&gt;Browser back/forward buttons work seamlessly.&lt;/li&gt;
&lt;li&gt;Typing a URL like &lt;code&gt;http://localhost:port/product/456&lt;/code&gt; directly in the browser takes you to the Product page with ID 456.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key GoRouter Features for Web Apps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. URL-Based Navigation
&lt;/h3&gt;

&lt;p&gt;GoRouter makes URLs the core of navigation. For example, navigating to &lt;code&gt;/product/123&lt;/code&gt; with &lt;code&gt;context.go('/product/123')&lt;/code&gt; updates the browser’s address bar, making the URL shareable.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Deep Linking
&lt;/h3&gt;

&lt;p&gt;GoRouter supports deep linking out of the box. If a user visits &lt;code&gt;http://yourapp.com/product/123&lt;/code&gt;, GoRouter parses the &lt;code&gt;productId&lt;/code&gt; and loads the correct screen. This is great for sharing links or integrating with external systems like notifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Browser History Integration
&lt;/h3&gt;

&lt;p&gt;GoRouter syncs with the browser’s history. Clicking the back button returns to the previous route (e.g., from &lt;code&gt;/about&lt;/code&gt; to &lt;code&gt;/&lt;/code&gt;), and forward navigates back. This happens automatically, no extra code needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Dynamic Routes
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;:productId&lt;/code&gt; syntax allows dynamic routes. You can access the parameter in the &lt;code&gt;builder&lt;/code&gt; with &lt;code&gt;state.pathParameters['productId']&lt;/code&gt;. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/product/:productId'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ProductScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;productId:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pathParameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'productId'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Query Parameters
&lt;/h3&gt;

&lt;p&gt;GoRouter also supports query parameters (e.g., &lt;code&gt;/search?query=flutter&lt;/code&gt;). Access them with &lt;code&gt;state.uri.queryParameters['query']&lt;/code&gt;. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/search'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queryParameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'query'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;'No query'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;SearchScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;query:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Redirects for Authentication
&lt;/h3&gt;

&lt;p&gt;For web apps, you might want to redirect users to a login page if they’re not authenticated. Add a redirect to the GoRouter config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;GoRouter&lt;/span&gt; &lt;span class="n"&gt;_router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GoRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;routes:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nl"&gt;redirect:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isLoggedIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Replace with your auth logic&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;isLoggedIn&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;'/login'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;'/login'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// No redirect&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tips for Building URL-Friendly Flutter Web Apps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test URLs Directly&lt;/strong&gt;: Try typing URLs like &lt;code&gt;/product/999&lt;/code&gt; in the browser to ensure deep linking works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Descriptive Paths&lt;/strong&gt;: Keep routes like &lt;code&gt;/about&lt;/code&gt; or &lt;code&gt;/product&lt;/code&gt; intuitive for users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle Errors Gracefully&lt;/strong&gt;: Use &lt;code&gt;errorBuilder&lt;/code&gt; to show user-friendly 404 pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize for SEO&lt;/strong&gt;: Clean URLs like &lt;code&gt;/product/123&lt;/code&gt; are better for search engines and sharing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Browser Navigation&lt;/strong&gt;: Ensure back/forward buttons work as expected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deploying the Web App
&lt;/h2&gt;

&lt;p&gt;To deploy your Flutter web app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build it with:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   flutter build web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Host the contents of the &lt;code&gt;build/web&lt;/code&gt; folder on a web server (e.g., Firebase Hosting, Netlify, or GitHub Pages).&lt;/li&gt;
&lt;li&gt;Ensure your server supports single-page app routing, redirecting all routes to &lt;code&gt;index.html&lt;/code&gt; for GoRouter to handle.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>web</category>
      <category>programming</category>
    </item>
    <item>
      <title>Understanding Flutter GoRouter for Beginners</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Sun, 14 Sep 2025 07:28:16 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/understanding-flutter-gorouter-for-beginners-17al</link>
      <guid>https://dev.to/bestaoui_aymen/understanding-flutter-gorouter-for-beginners-17al</guid>
      <description>&lt;h2&gt;
  
  
  What is GoRouter?
&lt;/h2&gt;

&lt;p&gt;GoRouter is a powerful and flexible routing package for Flutter, developed by the Flutter team. It makes navigation in Flutter apps easier by providing a simple, declarative way to define routes and handle navigation. Unlike Flutter's default &lt;code&gt;Navigator&lt;/code&gt; (which can be a bit complex for beginners), GoRouter uses a URL-based approach, similar to how websites work, making it intuitive and scalable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Use GoRouter?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple Syntax&lt;/strong&gt;: GoRouter lets you define routes using easy-to-understand code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL-Based Navigation&lt;/strong&gt;: It supports web-like URLs (e.g., &lt;code&gt;/home&lt;/code&gt; or &lt;code&gt;/profile/123&lt;/code&gt;), which is great for web apps and deep linking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested Routes&lt;/strong&gt;: You can create nested navigation (like tabs or subtabs) easily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameter Support&lt;/strong&gt;: Pass data like IDs (e.g., &lt;code&gt;/product/42&lt;/code&gt;) directly in the URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redirects&lt;/strong&gt;: Handle navigation logic, like redirecting users to a login page if they're not signed in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beginner-Friendly&lt;/strong&gt;: It reduces the complexity of managing navigation stacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up GoRouter
&lt;/h2&gt;

&lt;p&gt;Let’s walk through how to set up and use GoRouter in a Flutter app. We’ll create a simple app with two screens: a Home screen and a Profile screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add GoRouter to Your Project
&lt;/h3&gt;

&lt;p&gt;First, you need to add the &lt;code&gt;go_router&lt;/code&gt; package to your Flutter project. Open your &lt;code&gt;pubspec.yaml&lt;/code&gt; file and add the following dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;go_router&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^16.2.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, run &lt;code&gt;flutter pub get&lt;/code&gt; in your terminal to install the package. (Note: The version number might change, so check &lt;a href="https://pub.dev/packages/go_router" rel="noopener noreferrer"&gt;pub.dev&lt;/a&gt; for the latest version.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create Your Screens
&lt;/h3&gt;

&lt;p&gt;Let’s create two simple screens for our app: &lt;code&gt;HomeScreen&lt;/code&gt; and &lt;code&gt;ProfileScreen&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Home'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span class="n"&gt;MainAxisAlignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Welcome to the Home Screen!'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// We'll navigate to the Profile screen later&lt;/span&gt;
              &lt;span class="p"&gt;},&lt;/span&gt;
              &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Go to Profile'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProfileScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Optional parameter for user ID&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ProfileScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Profile'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Profile Screen&lt;/span&gt;&lt;span class="si"&gt;${userId != null ? ' for User $userId' : ''}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Set Up GoRouter
&lt;/h3&gt;

&lt;p&gt;Now, let’s configure GoRouter to handle navigation between these screens. In your &lt;code&gt;main.dart&lt;/code&gt;, set up the router and define the routes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:go_router/go_router.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'home_screen.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'profile_screen.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Define the GoRouter configuration&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;GoRouter&lt;/span&gt; &lt;span class="n"&gt;_router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GoRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;routes:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Root route (Home screen)&lt;/span&gt;
        &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/profile/:userId'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Profile route with a parameter&lt;/span&gt;
        &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pathParameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'userId'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ProfileScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;userId:&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'Flutter GoRouter Demo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;routerConfig:&lt;/span&gt; &lt;span class="n"&gt;_router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Use GoRouter for navigation&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explanation of the Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GoRouter Configuration&lt;/strong&gt;: We create a &lt;code&gt;GoRouter&lt;/code&gt; instance and define two routes:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/&lt;/code&gt;: The root route, which shows the &lt;code&gt;HomeScreen&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/profile/:userId&lt;/code&gt;: A route for the &lt;code&gt;ProfileScreen&lt;/code&gt; with a dynamic &lt;code&gt;userId&lt;/code&gt; parameter (e.g., &lt;code&gt;/profile/123&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;MaterialApp.router&lt;/strong&gt;: Instead of the usual &lt;code&gt;MaterialApp&lt;/code&gt;, we use &lt;code&gt;MaterialApp.router&lt;/code&gt; to integrate GoRouter.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Path Parameters&lt;/strong&gt;: The &lt;code&gt;:userId&lt;/code&gt; in &lt;code&gt;/profile/:userId&lt;/code&gt; allows us to pass dynamic data, like a user ID, to the &lt;code&gt;ProfileScreen&lt;/code&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Add Navigation
&lt;/h3&gt;

&lt;p&gt;Let’s update the &lt;code&gt;HomeScreen&lt;/code&gt; to navigate to the &lt;code&gt;ProfileScreen&lt;/code&gt; when the button is pressed. Modify the &lt;code&gt;ElevatedButton&lt;/code&gt; in &lt;code&gt;HomeScreen&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/profile/123'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Navigate to Profile with userId 123&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Go to Profile'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;context.go('/profile/123')&lt;/code&gt; tells GoRouter to navigate to the &lt;code&gt;/profile/123&lt;/code&gt; route, passing &lt;code&gt;123&lt;/code&gt; as the &lt;code&gt;userId&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Run the App
&lt;/h3&gt;

&lt;p&gt;Run your app using &lt;code&gt;flutter run&lt;/code&gt;. You should see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Home screen with a button.&lt;/li&gt;
&lt;li&gt;Clicking the button takes you to the Profile screen, displaying “Profile Screen for User 123”.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key GoRouter Features for Beginners
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Navigating Between Screens
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;context.go()&lt;/code&gt; to navigate to a new route. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/profile/456'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Navigates to ProfileScreen with userId 456&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Going Back
&lt;/h3&gt;

&lt;p&gt;To go back to the previous screen, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a back button to the &lt;code&gt;ProfileScreen&lt;/code&gt;’s body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Go Back'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Passing Parameters
&lt;/h3&gt;

&lt;p&gt;You’ve already seen how to pass a &lt;code&gt;userId&lt;/code&gt; in the route (&lt;code&gt;/profile/:userId&lt;/code&gt;). You can access it in the &lt;code&gt;builder&lt;/code&gt; using &lt;code&gt;state.pathParameters['userId']&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Nested Routes
&lt;/h3&gt;

&lt;p&gt;If your app has nested navigation (e.g., a dashboard with tabs), you can define subroutes. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/dashboard'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DashboardScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nl"&gt;routes:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'settings'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;SettingsScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, &lt;code&gt;/dashboard/settings&lt;/code&gt; will show the &lt;code&gt;SettingsScreen&lt;/code&gt; as a subroute of the &lt;code&gt;DashboardScreen&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Redirects
&lt;/h3&gt;

&lt;p&gt;You can redirect users based on conditions, like sending them to a login page if they’re not authenticated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;GoRouter&lt;/span&gt; &lt;span class="n"&gt;_router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GoRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;routes:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;GoRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nl"&gt;redirect:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isLoggedIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Replace with your auth logic&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;isLoggedIn&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;'/login'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;'/login'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// No redirect&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tips for Beginners
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start Simple&lt;/strong&gt;: Begin with basic routes like we did above before exploring nested routes or redirects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Descriptive Paths&lt;/strong&gt;: Make your route paths clear, like &lt;code&gt;/home&lt;/code&gt; or &lt;code&gt;/profile&lt;/code&gt;, to keep your code readable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Navigation&lt;/strong&gt;: Always test your routes to ensure they work as expected, especially when passing parameters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the Docs&lt;/strong&gt;: The &lt;a href="https://pub.dev/documentation/go_router/latest/" rel="noopener noreferrer"&gt;GoRouter documentation&lt;/a&gt; is beginner-friendly and has more examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try experimenting with more routes or adding redirects to enhance your app. Happy coding!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>flutter</category>
      <category>dart</category>
      <category>navigation</category>
    </item>
    <item>
      <title>Dependency Injection in Flutter: Simplifying App Architecture</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Sun, 31 Aug 2025 23:15:50 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/dependency-injection-in-flutter-simplifying-app-architecture-1j97</link>
      <guid>https://dev.to/bestaoui_aymen/dependency-injection-in-flutter-simplifying-app-architecture-1j97</guid>
      <description>&lt;h2&gt;
  
  
  What is Dependency Injection?
&lt;/h2&gt;

&lt;p&gt;Dependency Injection is a technique where an object receives its dependencies from an external source rather than creating them itself. This promotes loose coupling and enhances code flexibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of Dependency Injection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constructor Injection&lt;/strong&gt;: Passing dependencies via a constructor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setter Injection&lt;/strong&gt;: Providing dependencies through setter methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Method Injection&lt;/strong&gt;: Supplying dependencies as method parameters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Flutter, constructor injection is the most common approach due to its simplicity and alignment with Dart’s object-oriented nature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use Dependency Injection in Flutter?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modularity&lt;/strong&gt;: Swap implementations (e.g., mock services for testing) without changing the core logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testability&lt;/strong&gt;: Easily mock dependencies for unit tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Manage complex dependency trees in large apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: Reduce tight coupling between classes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Popular DI Solutions in Flutter
&lt;/h2&gt;

&lt;p&gt;Several packages simplify DI in Flutter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_it&lt;/code&gt;&lt;/strong&gt;: A lightweight service locator, easy to set up and widely used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;provider&lt;/code&gt;&lt;/strong&gt;: Often used for state management but can handle DI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;injectable&lt;/code&gt;&lt;/strong&gt;: A code-generator-based DI solution for advanced setups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;kiwi&lt;/code&gt;&lt;/strong&gt;: Another service locator with a focus on simplicity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This blog focuses on &lt;code&gt;get_it&lt;/code&gt; due to its popularity and ease of use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up &lt;code&gt;get_it&lt;/code&gt; for Dependency Injection
&lt;/h2&gt;

&lt;p&gt;Let’s walk through implementing DI in a Flutter app using &lt;code&gt;get_it&lt;/code&gt;. We’ll build a simple app that fetches and displays user data from a mock API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add Dependencies
&lt;/h3&gt;

&lt;p&gt;Add &lt;code&gt;get_it&lt;/code&gt; to your &lt;code&gt;pubspec.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;get_it&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^8.2.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;flutter pub get&lt;/code&gt; to install the package.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create a Service Locator
&lt;/h3&gt;

&lt;p&gt;Set up a singleton instance of &lt;code&gt;GetIt&lt;/code&gt; to register and access dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:get_it/get_it.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;getIt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetIt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setupDependencies&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;getIt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;registerSingleton&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UserService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;UserService&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="n"&gt;getIt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;registerFactory&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UserRepository&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;UserRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getIt&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UserService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;registerSingleton&lt;/code&gt;&lt;/strong&gt;: Creates a single instance reused throughout the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;registerFactory&lt;/code&gt;&lt;/strong&gt;: Creates a new instance each time the dependency is requested.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;registerLazySingleton&lt;/code&gt;&lt;/strong&gt;: Creates a single instance only when first requested.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Define Services and Repositories
&lt;/h3&gt;

&lt;p&gt;Create a simple service and repository to demonstrate DI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// user_service.dart&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fetchUserName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Simulate API call&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delayed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;'John Doe'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// user_repository.dart&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;UserService&lt;/span&gt; &lt;span class="n"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;UserRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getUserName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;userService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fetchUserName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Integrate DI in Your Flutter App
&lt;/h3&gt;

&lt;p&gt;Use the registered dependencies in a Flutter widget.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:get_it/get_it.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;setupDependencies&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Initialize dependencies&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;UserScreen&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;UserScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;_UserScreenState&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_UserScreenState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_UserScreenState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UserScreen&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;_userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'Loading...'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;initState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;_loadUserName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_loadUserName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getIt&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UserRepository&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUserName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;_userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'User Profile'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Semantics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;label:&lt;/span&gt; &lt;span class="s"&gt;'User name display'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;'User: &lt;/span&gt;&lt;span class="si"&gt;$_userName&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explanation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service Locator&lt;/strong&gt;: &lt;code&gt;getIt&lt;/code&gt; holds the &lt;code&gt;UserService&lt;/code&gt; and &lt;code&gt;UserRepository&lt;/code&gt; instances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Injection&lt;/strong&gt;: &lt;code&gt;UserRepository&lt;/code&gt; receives &lt;code&gt;UserService&lt;/code&gt; via constructor injection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Widget Integration&lt;/strong&gt;: The &lt;code&gt;UserScreen&lt;/code&gt; widget accesses &lt;code&gt;UserRepository&lt;/code&gt; using &lt;code&gt;getIt&amp;lt;UserRepository&amp;gt;()&lt;/code&gt; to fetch data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best Practices for Dependency Injection
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Centralize Registration&lt;/strong&gt;: Define all dependencies in a single &lt;code&gt;setupDependencies&lt;/code&gt; function for clarity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Singleton for Services&lt;/strong&gt;: Register services like APIs or databases as singletons to avoid redundant instances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test with Mocks&lt;/strong&gt;: Replace real services with mocks during testing using &lt;code&gt;getIt.reset()&lt;/code&gt; or &lt;code&gt;getIt.registerSingleton&amp;lt;MockService&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep It Simple&lt;/strong&gt;: Avoid overcomplicating DI setups for small apps; use &lt;code&gt;get_it&lt;/code&gt; or &lt;code&gt;provider&lt;/code&gt; for straightforward needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine with State Management&lt;/strong&gt;: Integrate DI with state management solutions like &lt;code&gt;provider&lt;/code&gt; or &lt;code&gt;Riverpod&lt;/code&gt; for cohesive architecture.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common Pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overusing Singletons&lt;/strong&gt;: Avoid registering everything as a singleton; use factories for objects that need fresh instances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circular Dependencies&lt;/strong&gt;: Ensure dependencies don’t create cycles, causing runtime errors.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>flutter</category>
      <category>dart</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Securing Flutter Apps: Best Practices for Protecting User Data</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Thu, 28 Aug 2025 22:20:46 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/securing-flutter-apps-best-practices-for-protecting-user-data-5ghn</link>
      <guid>https://dev.to/bestaoui_aymen/securing-flutter-apps-best-practices-for-protecting-user-data-5ghn</guid>
      <description>&lt;p&gt;Protecting user data in Flutter apps is critical to building trust and ensuring compliance. This blog explores key practices to secure your Flutter app, from data storage to network communication, helping you create robust and reliable applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Secure Data Storage
&lt;/h2&gt;

&lt;p&gt;Storing sensitive data like passwords or API keys securely is essential to prevent unauthorized access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;flutter_secure_storage&lt;/code&gt;&lt;/strong&gt;: Leverage platform-specific secure storage (e.g., Keychain on iOS, Keystore on Android) for sensitive data. Example:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter_secure_storage/flutter_secure_storage.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FlutterSecureStorage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Write data&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;key:&lt;/span&gt; &lt;span class="s"&gt;'auth_token'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;value:&lt;/span&gt; &lt;span class="s"&gt;'your_token'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Read data&lt;/span&gt;
  &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;key:&lt;/span&gt; &lt;span class="s"&gt;'auth_token'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoid Shared Preferences for Sensitive Data&lt;/strong&gt;: The &lt;code&gt;shared_preferences&lt;/code&gt; package stores data in plain text, making it unsuitable for sensitive information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypt Local Databases&lt;/strong&gt;: Use packages like &lt;code&gt;encrypt&lt;/code&gt; with AES encryption for sensitive fields in &lt;code&gt;sqflite&lt;/code&gt; databases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Implement Secure Authentication
&lt;/h2&gt;

&lt;p&gt;Strong authentication mechanisms are vital to protect user accounts from unauthorized access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Secure Authentication Providers&lt;/strong&gt;: Integrate Firebase Authentication, Auth0, or OAuth 2.0 for secure login flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement Token-Based Authentication&lt;/strong&gt;: Store JSON Web Tokens (JWT) or refresh tokens in &lt;code&gt;flutter_secure_storage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable Multi-Factor Authentication (MFA)&lt;/strong&gt;: Add an extra security layer with MFA via Firebase or third-party services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate Inputs&lt;/strong&gt;: Sanitize user inputs to prevent injection attacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Secure Network Communication
&lt;/h2&gt;

&lt;p&gt;Ensuring secure data transmission prevents interception or tampering during API calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use HTTPS&lt;/strong&gt;: Always use HTTPS for API calls to encrypt data in transit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement Certificate Pinning&lt;/strong&gt;: Use &lt;code&gt;http_certificate_pinning&lt;/code&gt; to ensure communication with trusted servers. Example:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http_certificate_pinning/http_certificate_pinning.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;secureHttpClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SecureHttpClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;secureHttpClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addCertificate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'your_server_certificate_sha256'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encrypt API Payloads&lt;/strong&gt;: Encrypt sensitive data before transmission using the &lt;code&gt;encrypt&lt;/code&gt; package. Example:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:encrypt/encrypt.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromUtf8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'32-length-key-1234567890123456'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;iv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IV&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;encrypter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Encrypter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;encrypted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;encrypter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'sensitive_data'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;iv:&lt;/span&gt; &lt;span class="n"&gt;iv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Protect Against Code Tampering
&lt;/h2&gt;

&lt;p&gt;Prevent attackers from reverse-engineering or tampering with your app’s code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obfuscate Code&lt;/strong&gt;: Use &lt;code&gt;flutter build --obfuscate --split-debug-info=/path/to/debug&lt;/code&gt; for release builds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use ProGuard for Android&lt;/strong&gt;: Configure ProGuard rules in &lt;code&gt;android/app/proguard-rules.pro&lt;/code&gt; to obfuscate APKs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move Sensitive Logic to Backend&lt;/strong&gt;: Handle critical logic in a secure backend instead of hardcoding in the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Manage Dependencies Securely
&lt;/h2&gt;

&lt;p&gt;Vulnerable dependencies can introduce security risks into your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit Dependencies&lt;/strong&gt;: Use &lt;code&gt;flutter pub outdated&lt;/code&gt; or Dependabot to keep packages updated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for Vulnerabilities&lt;/strong&gt;: Integrate tools like &lt;code&gt;safety&lt;/code&gt; or OWASP Dependency-Check in your CI/CD pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimize Dependencies&lt;/strong&gt;: Reduce the attack surface by including only necessary packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Comply with Data Privacy Regulations
&lt;/h2&gt;

&lt;p&gt;Compliance with regulations like GDPR or CCPA is essential for apps handling user data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obtain User Consent&lt;/strong&gt;: Use &lt;code&gt;app_tracking_transparency&lt;/code&gt; (iOS) to request data collection consent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement Data Minimization&lt;/strong&gt;: Collect only necessary data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide Data Deletion Options&lt;/strong&gt;: Allow users to delete their data to comply with “right to be forgotten” rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Display a Privacy Policy&lt;/strong&gt;: Clearly communicate data handling practices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Integrate Security Testing in CI/CD
&lt;/h2&gt;

&lt;p&gt;Embedding security checks in your CI/CD pipeline catches vulnerabilities early.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static Code Analysis&lt;/strong&gt;: Use &lt;code&gt;dartanalyzer&lt;/code&gt; or SonarQube to identify insecure code patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Security Scans&lt;/strong&gt;: Integrate MobSF or OWASP ZAP in CI/CD pipelines (e.g., GitHub Actions). Example workflow:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Security Scan&lt;/span&gt;
  &lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
  &lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;security&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
      &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run MobSF&lt;/span&gt;
          &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker run -it opensecurity/mobile-security-framework-mobsf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Penetration Testing&lt;/strong&gt;: Conduct periodic manual or automated penetration tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Educate Users on Security
&lt;/h2&gt;

&lt;p&gt;Empowering users enhances overall app security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Password Guidelines&lt;/strong&gt;: Encourage strong passwords with feedback on strength.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Notifications&lt;/strong&gt;: Notify users of suspicious activities via push notifications or email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear Error Messages&lt;/strong&gt;: Avoid exposing sensitive information in error messages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By adopting these security practices—secure storage, robust authentication, encrypted communication, and automated testing—you can protect user data and ensure compliance in your Flutter apps. Start implementing these strategies today to build secure, trustworthy applications.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>flutter</category>
      <category>dart</category>
      <category>security</category>
    </item>
    <item>
      <title>5 App Store Rejections You’ll Wish You Dodged!</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Sun, 24 Aug 2025 21:20:01 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/5-app-store-rejections-youll-wish-you-dodged-546a</link>
      <guid>https://dev.to/bestaoui_aymen/5-app-store-rejections-youll-wish-you-dodged-546a</guid>
      <description>&lt;p&gt;Submitting an app to the App Store can feel like sending your baby out into the world—only to have it sent back with a rejection notice. Apple’s strict guidelines catch many developers off guard, and dodging these pitfalls can save you time, money, and a whole lot of stress. Here are five common App Store rejections you’ll wish you avoided, along with tips to steer clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Crashing Apps: The Silent Dealbreaker
&lt;/h2&gt;

&lt;p&gt;Nothing screams “reject me” like an app that crashes during review. Apple’s team tests apps rigorously, and if your app freezes, lags, or flat-out dies, it’s getting the boot.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why it happens&lt;/strong&gt;: Bugs, unoptimized code, or compatibility issues with iOS versions or devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to dodge it&lt;/strong&gt;: Test your app across multiple devices (e.g., iPhone 14, iPad Air) and iOS versions using tools like Xcode’s Simulator or TestFlight. Use crash reporting tools like Firebase Crashlytics to catch issues before submission. Pro tip: Simulate low-memory conditions to ensure stability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Incomplete or Misleading Metadata
&lt;/h2&gt;

&lt;p&gt;Your app might be a masterpiece, but if your metadata—screenshots, descriptions, or keywords—is incomplete or misleading, Apple will send it back faster than you can say “resubmit.”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why it happens&lt;/strong&gt;: Vague descriptions, placeholder text, or screenshots that don’t reflect the app’s functionality violate Apple’s transparency rules (Guideline 2.3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to dodge it&lt;/strong&gt;: Craft clear, concise descriptions that match your app’s purpose. Use high-quality screenshots showcasing real features, not mockups. Double-check your keywords for relevance and avoid stuffing them with unrelated terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Violating User Privacy
&lt;/h2&gt;

&lt;p&gt;Apple takes user privacy seriously, and any slip-up here is a one-way ticket to rejection city. If your app collects data without clear permission or lacks a privacy policy, you’re in trouble.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why it happens&lt;/strong&gt;: Missing or unclear permission prompts (e.g., for camera, location) or no privacy policy link (Guideline 5.1).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to dodge it&lt;/strong&gt;: Use iOS’s built-in permission dialogs and explain &lt;em&gt;why&lt;/em&gt; you need access (e.g., “We need your location to show nearby restaurants”). Include a privacy policy in your app and on your website, ensuring it complies with local laws like GDPR or CCPA.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Copycat Apps or Minimal Functionality
&lt;/h2&gt;

&lt;p&gt;Apple hates apps that feel like clones or offer little value. If your app is a near-duplicate of another or lacks meaningful features, it’ll get flagged for “spam” or “minimum functionality” (Guideline 4.3).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why it happens&lt;/strong&gt;: Apps that mimic popular ones without unique features or those with bare-bones functionality (e.g., a single web view wrapper).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to dodge it&lt;/strong&gt;: Add unique value—whether it’s a novel feature, slick design, or niche utility. Test your app’s “why” against existing apps. If it’s just a reskinned calculator, rethink your approach.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Hidden or Undisclosed Features
&lt;/h2&gt;

&lt;p&gt;Trying to sneak undocumented features past Apple’s reviewers? Good luck. Hidden functionalities, like secret in-app purchases or unlisted data collection, will get you rejected (Guideline 2.3.1).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why it happens&lt;/strong&gt;: Developers hide features to bypass review or surprise users, but Apple’s team is thorough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to dodge it&lt;/strong&gt;: Be upfront about all features in your submission notes. If your app has in-app purchases, clearly outline them. Transparency is your friend—Apple’s reviewers aren’t fans of surprises.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Avoiding these rejections comes down to preparation and attention to detail. Test rigorously, be transparent, and align with Apple’s guidelines from the start. A little extra effort upfront can save you from the headache of resubmissions and keep your app on track for App Store success. Got a rejection story? Share it below—we’ve all been there!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>flutter</category>
      <category>android</category>
      <category>ios</category>
    </item>
    <item>
      <title>🚀 5 Amazing Machine Learning App Ideas You Can Build with Flutter</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Thu, 21 Aug 2025 21:57:54 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/5-amazing-machine-learning-app-ideas-you-can-build-with-flutter-39nl</link>
      <guid>https://dev.to/bestaoui_aymen/5-amazing-machine-learning-app-ideas-you-can-build-with-flutter-39nl</guid>
      <description>&lt;p&gt;Flutter has become one of the most popular frameworks for building beautiful, cross-platform apps. But what makes Flutter even more exciting is its ability to integrate with machine learning (ML) models, allowing developers to create intelligent apps that go beyond static UIs. Whether you’re a beginner or an experienced developer, combining Flutter with ML (via TensorFlow Lite, Firebase ML Kit, or custom APIs) opens up tons of creative opportunities.  &lt;/p&gt;

&lt;p&gt;In this post, we’ll explore &lt;strong&gt;5 ML app ideas you can build with Flutter&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  1. 📸 Image Recognition App
&lt;/h2&gt;

&lt;p&gt;An image recognition app lets users upload or take photos and instantly identify objects, animals, or landmarks.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Identify plant species, detect product types in e-commerce apps, or recognize food items for a calorie tracker.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech stack:&lt;/strong&gt; Flutter + TensorFlow Lite (image classification model).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra feature:&lt;/strong&gt; Add AR (augmented reality) to overlay information directly on objects using Flutter plugins.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. 📝 Handwriting to Text Converter
&lt;/h2&gt;

&lt;p&gt;Build an app where users write on the screen, and the app converts the handwriting into digital text.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Note-taking apps for students, digital signature recognition, or smart whiteboards.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech stack:&lt;/strong&gt; Flutter + Firebase ML Kit (text recognition).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra feature:&lt;/strong&gt; Support multiple languages and export notes to PDF.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. 🗣️ Real-Time Language Translator
&lt;/h2&gt;

&lt;p&gt;Imagine speaking in your native language and instantly getting translations in another.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Travel apps, language learning platforms, or international chat apps.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech stack:&lt;/strong&gt; Flutter + Google Translate API + Speech-to-Text.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra feature:&lt;/strong&gt; Add offline translation support with on-device ML models.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. 🤖 AI-Powered Chatbot App
&lt;/h2&gt;

&lt;p&gt;Create a chatbot that answers user questions using natural language processing (NLP).  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Customer service bots, health consultation, educational tutors.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech stack:&lt;/strong&gt; Flutter + OpenAI API / Dialogflow.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra feature:&lt;/strong&gt; Add voice input and output for a conversational feel.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. 📰 Smart News Summarizer
&lt;/h2&gt;

&lt;p&gt;An app that takes long articles and generates short, easy-to-read summaries.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; News aggregator apps, productivity tools.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech stack:&lt;/strong&gt; Flutter + Hugging Face NLP models (summarization).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra feature:&lt;/strong&gt; Add text-to-speech so users can listen to summaries on the go.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 How to Get Started with ML in Flutter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;TensorFlow Lite&lt;/strong&gt; for running models on-device.
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Firebase ML Kit&lt;/strong&gt; for pre-trained ML tasks like OCR, face detection, and language translation.
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;REST APIs&lt;/strong&gt; to connect to powerful ML models hosted on the cloud (Hugging Face, OpenAI, etc.).
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Machine learning + Flutter is a game-changer. These app ideas can be great for &lt;strong&gt;portfolio projects&lt;/strong&gt;, &lt;strong&gt;startups&lt;/strong&gt;, or even &lt;strong&gt;hackathons&lt;/strong&gt;. Start with small models, then iterate to create intelligent apps that solve real problems.  &lt;/p&gt;

&lt;p&gt;👉 Which idea are you most excited to build?  &lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>machinelearning</category>
      <category>tensorflow</category>
    </item>
    <item>
      <title>5 Flutter Performance Hacks to Boost Your App's Efficiency</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Sun, 17 Aug 2025 20:25:38 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/5-flutter-performance-hacks-to-boost-your-apps-efficiency-4o48</link>
      <guid>https://dev.to/bestaoui_aymen/5-flutter-performance-hacks-to-boost-your-apps-efficiency-4o48</guid>
      <description>&lt;p&gt;Flutter is a powerful framework for building cross-platform apps, but even the best tools need optimization to deliver smooth, responsive user experiences. Below are five performance hacks to help you supercharge your Flutter app.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Optimize Widget Rebuilds with &lt;code&gt;const&lt;/code&gt; Constructors
&lt;/h2&gt;

&lt;p&gt;Flutter's reactive UI rebuilds widgets when state changes, but unnecessary rebuilds can slow your app. Using &lt;code&gt;const&lt;/code&gt; constructors for stateless widgets prevents them from rebuilding when their configuration hasn't changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declare widgets with &lt;code&gt;const&lt;/code&gt; whenever their properties are immutable.&lt;/li&gt;
&lt;li&gt;Example:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nf"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Welcome to My App'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;const&lt;/code&gt; for static parts of your UI, like headers or icons, to reduce rendering overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Cuts down on widget tree diffing, improving frame rendering times.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Leverage &lt;code&gt;ListView.builder&lt;/code&gt; for Large Lists
&lt;/h2&gt;

&lt;p&gt;Rendering long lists with &lt;code&gt;ListView&lt;/code&gt; can cause lag because it builds all items at once. &lt;code&gt;ListView.builder&lt;/code&gt; creates items only as they become visible, reducing memory usage and improving scroll performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;ListView&lt;/code&gt; with &lt;code&gt;ListView.builder&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;itemCount:&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;itemBuilder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ListTile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;For complex grids, use &lt;code&gt;GridView.builder&lt;/code&gt; similarly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Reduces memory footprint and speeds up list rendering, especially for dynamic or large datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Minimize State Changes with Provider or Riverpod
&lt;/h2&gt;

&lt;p&gt;State management can bloat performance if not handled carefully. Libraries like Provider or Riverpod allow you to update only the necessary parts of the UI, avoiding full widget tree rebuilds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;Consumer&lt;/code&gt; in Provider to rebuild specific widgets:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;With Riverpod, use &lt;code&gt;ref.watch&lt;/code&gt; selectively to limit rebuild scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Reduces unnecessary rebuilds, leading to smoother UI updates and lower CPU usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Use Image Compression and Caching
&lt;/h2&gt;

&lt;p&gt;Large images can slow down your app due to high memory usage and loading times. Compressing images and caching them efficiently can significantly boost performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compress images before adding them to your assets (tools like TinyPNG work well).&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;CachedNetworkImage&lt;/code&gt; for remote images:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="n"&gt;CachedNetworkImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;imageUrl:&lt;/span&gt; &lt;span class="s"&gt;'https://example.com/image.jpg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;placeholder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CircularProgressIndicator&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nl"&gt;errorWidget:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Set appropriate &lt;code&gt;cacheWidth&lt;/code&gt; and &lt;code&gt;cacheHeight&lt;/code&gt; to resize images in memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Lowers memory usage and speeds up image loading, especially for network-heavy apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Profile and Optimize with DevTools
&lt;/h2&gt;

&lt;p&gt;Flutter DevTools is your go-to for identifying performance bottlenecks. It provides insights into frame rendering, memory usage, and widget rebuilds, helping you pinpoint and fix issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;flutter run --profile&lt;/code&gt; to launch your app in profile mode.&lt;/li&gt;
&lt;li&gt;Open DevTools via &lt;code&gt;flutter pub global run devtools&lt;/code&gt; or your IDE.&lt;/li&gt;
&lt;li&gt;Use the &lt;strong&gt;Performance&lt;/strong&gt; tab to analyze frame times and the &lt;strong&gt;Widget Inspector&lt;/strong&gt; to detect over-rebuilding widgets.&lt;/li&gt;
&lt;li&gt;Optimize based on findings, such as reducing expensive operations in &lt;code&gt;build&lt;/code&gt; methods.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Provides data-driven insights to eliminate performance issues, ensuring a smooth 60fps experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By applying these five hacks—using &lt;code&gt;const&lt;/code&gt; constructors, leveraging &lt;code&gt;ListView.builder&lt;/code&gt;, optimizing state management, compressing images, and profiling with DevTools—you can significantly enhance your Flutter app’s performance. Start small, measure with DevTools, and iterate to keep your app fast and responsive.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>learning</category>
    </item>
    <item>
      <title>5 Flutter App Ideas for Beginners</title>
      <dc:creator>Bestaoui Aymen</dc:creator>
      <pubDate>Fri, 15 Aug 2025 14:36:51 +0000</pubDate>
      <link>https://dev.to/bestaoui_aymen/5-flutter-app-ideas-for-beginners-15n9</link>
      <guid>https://dev.to/bestaoui_aymen/5-flutter-app-ideas-for-beginners-15n9</guid>
      <description>&lt;p&gt;Flutter, Google’s UI toolkit, is an excellent choice for beginners to build cross-platform mobile apps with a single codebase. Below are five beginner-friendly app ideas that can help you learn Flutter’s core concepts like widgets, state management, and navigation while creating functional and engaging applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. To-Do List App
&lt;/h2&gt;

&lt;p&gt;A To-Do List app is a classic beginner project that introduces you to Flutter’s core components and state management.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features to Include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add, edit, and delete tasks.&lt;/li&gt;
&lt;li&gt;Mark tasks as completed.&lt;/li&gt;
&lt;li&gt;Persist tasks using local storage (e.g., &lt;code&gt;shared_preferences&lt;/code&gt; package).&lt;/li&gt;
&lt;li&gt;Categorize tasks (e.g., work, personal).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learning Outcomes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Understand Flutter’s widget tree (Stateless and Stateful widgets).&lt;/li&gt;
&lt;li&gt;Implement basic CRUD operations.&lt;/li&gt;
&lt;li&gt;Learn to use packages for local storage.&lt;/li&gt;
&lt;li&gt;Practice ListView and user input handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why It’s Beginner-Friendly:
&lt;/h3&gt;

&lt;p&gt;This app requires only basic UI components (TextFields, Buttons, Lists) and simple state management, making it a great starting point.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Weather App
&lt;/h2&gt;

&lt;p&gt;A Weather App introduces you to integrating APIs and handling asynchronous data in Flutter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features to Include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fetch current weather data for a user’s location or a searched city using a free API (e.g., OpenWeatherMap).&lt;/li&gt;
&lt;li&gt;Display temperature, humidity, and weather conditions.&lt;/li&gt;
&lt;li&gt;Show a simple forecast for the next few days.&lt;/li&gt;
&lt;li&gt;Add a refresh button to update the data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learning Outcomes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Work with HTTP requests using the &lt;code&gt;http&lt;/code&gt; package.&lt;/li&gt;
&lt;li&gt;Parse JSON data and display it in the UI.&lt;/li&gt;
&lt;li&gt;Handle asynchronous operations with &lt;code&gt;Future&lt;/code&gt; and &lt;code&gt;async/await&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Design responsive layouts with Flutter’s widgets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why It’s Beginner-Friendly:
&lt;/h3&gt;

&lt;p&gt;The app focuses on a single API integration and a straightforward UI, allowing you to learn API handling without complex logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Expense Tracker
&lt;/h2&gt;

&lt;p&gt;An Expense Tracker app helps you practice data manipulation and UI design while building a practical tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features to Include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add expenses with details like amount, category, and date.&lt;/li&gt;
&lt;li&gt;Display a list of expenses with a total summary.&lt;/li&gt;
&lt;li&gt;Visualize expenses with a simple chart (e.g., using the &lt;code&gt;fl_chart&lt;/code&gt; package).&lt;/li&gt;
&lt;li&gt;Save expenses locally using &lt;code&gt;shared_preferences&lt;/code&gt; or &lt;code&gt;sqflite&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learning Outcomes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Manage state with providers or setState.&lt;/li&gt;
&lt;li&gt;Create reusable widgets for expense entries.&lt;/li&gt;
&lt;li&gt;Learn to use charting libraries in Flutter.&lt;/li&gt;
&lt;li&gt;Implement basic database operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why It’s Beginner-Friendly:
&lt;/h3&gt;

&lt;p&gt;The app involves straightforward data input and output, with optional complexity (charts or database) that you can scale based on your skill level.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Quiz App
&lt;/h2&gt;

&lt;p&gt;A Quiz App is a fun way to learn navigation and state management while creating an interactive experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features to Include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Display multiple-choice questions from a predefined list or a trivia API (e.g., Open Trivia Database).&lt;/li&gt;
&lt;li&gt;Keep track of the user’s score.&lt;/li&gt;
&lt;li&gt;Navigate between questions and show a results screen.&lt;/li&gt;
&lt;li&gt;Add a timer for each question (optional).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learning Outcomes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Implement navigation using Navigator and routes.&lt;/li&gt;
&lt;li&gt;Manage state for quiz progress and scores.&lt;/li&gt;
&lt;li&gt;Work with conditional rendering for correct/incorrect answers.&lt;/li&gt;
&lt;li&gt;Optionally integrate a simple API for dynamic questions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why It’s Beginner-Friendly:
&lt;/h3&gt;

&lt;p&gt;The app uses a limited set of screens and simple logic for scoring, making it ideal for learning navigation and basic interactivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Recipe Book App
&lt;/h2&gt;

&lt;p&gt;A Recipe Book app lets you explore UI design and data persistence while building a visually appealing app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features to Include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Display a list of recipes with images, ingredients, and instructions.&lt;/li&gt;
&lt;li&gt;Allow users to add their own recipes.&lt;/li&gt;
&lt;li&gt;Save recipes locally using &lt;code&gt;shared_preferences&lt;/code&gt; or &lt;code&gt;sqflite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add a search or filter feature to find recipes by category or ingredient.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learning Outcomes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Design complex layouts with images and text.&lt;/li&gt;
&lt;li&gt;Implement forms for user input.&lt;/li&gt;
&lt;li&gt;Practice local data storage and retrieval.&lt;/li&gt;
&lt;li&gt;Learn to use search functionality with lists.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why It’s Beginner-Friendly:
&lt;/h3&gt;

&lt;p&gt;The app focuses on UI design and basic data handling, with room to add advanced features like search as you progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips for Building These Apps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start Small&lt;/strong&gt;: Focus on core features first, then add enhancements like animations or advanced state management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Flutter Documentation&lt;/strong&gt;: Refer to the official Flutter docs and packages on pub.dev for guidance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Community Resources&lt;/strong&gt;: Explore tutorials on YouTube or blogs for step-by-step guidance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on Emulators&lt;/strong&gt;: Use Android/iOS emulators to test your apps and ensure they work across platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These app ideas are designed to be approachable, allowing you to build confidence in Flutter while creating portfolio-worthy projects. Pick one that excites you, and happy coding!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
