<?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: Flutter with Caio</title>
    <description>The latest articles on DEV Community by Flutter with Caio (@flutterwithcaio).</description>
    <link>https://dev.to/flutterwithcaio</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%2F2010691%2F2c3c8653-24c4-4b4c-aca6-edf7b2ac86ea.png</url>
      <title>DEV Community: Flutter with Caio</title>
      <link>https://dev.to/flutterwithcaio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flutterwithcaio"/>
    <language>en</language>
    <item>
      <title>Stop Relying on MediaQuery for Sizing in Flutter! Here's What to Use Instead</title>
      <dc:creator>Flutter with Caio</dc:creator>
      <pubDate>Thu, 17 Oct 2024 22:32:47 +0000</pubDate>
      <link>https://dev.to/flutterwithcaio/stop-relying-on-mediaquery-for-sizing-in-flutter-heres-what-to-use-instead-5eo7</link>
      <guid>https://dev.to/flutterwithcaio/stop-relying-on-mediaquery-for-sizing-in-flutter-heres-what-to-use-instead-5eo7</guid>
      <description>&lt;p&gt;MediaQuery is not the best tool for responsive design in Flutter. Actually, it's far from it.&lt;/p&gt;

&lt;p&gt;I know, it’s tempting to scale widgets based on the percentage of screen size and call it a day. But using MediaQuery for sizing, while seemingly simple, is a slippery slope that often leads to weird and problematic layouts.&lt;/p&gt;

&lt;p&gt;Unfortunately, many beginners fall into the trap of using fractional sizing because it seems like an easy solution at first.&lt;/p&gt;

&lt;p&gt;But if you’re serious about creating responsive apps, it’s time to reconsider how you approach this.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Fractional Sizing?
&lt;/h2&gt;

&lt;p&gt;Fractional sizing means sizing UI elements by a fraction of the screen size.&lt;/p&gt;

&lt;p&gt;It’s like saying, “I’ll make this button take up 20% of the screen width, no matter what the actual size is.”&lt;/p&gt;

&lt;p&gt;Flutter's &lt;code&gt;MediaQuery&lt;/code&gt; is  the go-to for this kind of approach. Because it provides access to the screen size through &lt;code&gt;MediaQuery.sizeOf(context)&lt;/code&gt; and &lt;code&gt;MediaQuery.of(context).size&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example, you might use code like this:&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;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;width:&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// or MediaQuery.sizeOf(context).width&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;'Click me!'&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;It might seem practical—the button size changes depending on the device. But here’s where it gets messy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Fractional Sizing Hurts Your Layouts
&lt;/h2&gt;

&lt;p&gt;The problem is that fractional sizing often leads to a rigid, uninspired layout that doesn’t fully take advantage of each device’s strengths.&lt;/p&gt;

&lt;p&gt;Responsiveness isn’t just about making an app fit into the available space—it’s about &lt;strong&gt;making your UI adapt to each device's strengths and weaknesses&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By using fractional sizing, you’re essentially making everything fit within the available space, but at the cost of meaningful adaptability. For example, look at this image:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ib224mi6xdrh4vct5jm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ib224mi6xdrh4vct5jm.png" alt="Image from ping’s notes" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;
Image from [ping’s notes](https://notes.tst.sh/flutter/media-query/#wouldnt-text-look-too-small-on-large-screens)



&lt;p&gt;&lt;strong&gt;Bigger displays allow a larger field of view&lt;/strong&gt; for the user. Don’t ditch that by just scaling your text up and calling it a day. Let larger screens &lt;em&gt;breathe&lt;/em&gt; with more content or features.&lt;/p&gt;

&lt;p&gt;Here's a better layout for the tablet:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cqxwqv7e6z2ai991evu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cqxwqv7e6z2ai991evu.png" alt="Image from ping’s notes" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;
Image from [ping’s notes](https://notes.tst.sh/flutter/media-query/#wouldnt-text-look-too-small-on-large-screens)



&lt;p&gt;The key point is: &lt;strong&gt;what fits great on a small phone might feel unnecessarily large or cramped on a tablet or desktop.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Widgets may occupy a smaller fraction of the screen, but larger displays give more real estate—so why not take advantage of it?&lt;/p&gt;
&lt;h2&gt;
  
  
  You Don't Need Your Text to Be Bigger
&lt;/h2&gt;

&lt;p&gt;You don't need to size your font based on the screen size. For example:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfojh89hn005btm80nib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfojh89hn005btm80nib.png" alt="Image from ping’s notes" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;
Image from [ping’s notes](https://notes.tst.sh/flutter/media-query/#wouldnt-text-look-too-small-on-large-screens)



&lt;p&gt;It is noticeable that the text is as visible to the tablet user as it is for the smartphone user. It's perfectly fine to use static values for font sizes.&lt;/p&gt;

&lt;p&gt;A responsive layout shouldn’t just be resized—it should reorganize and realign itself to make the most out of each device's  capabilities.&lt;/p&gt;
&lt;h2&gt;
  
  
  Overflow Errors? Not If You Manage Your Constraints Right
&lt;/h2&gt;

&lt;p&gt;Now, you might be thinking, "If I don't size elements based on device size, won’t I run into overflow issues?" &lt;/p&gt;

&lt;p&gt;Overflow errors are less about using fractional sizing and more about not respecting the given constraints.&lt;/p&gt;

&lt;p&gt;The real secret to avoiding overflow isn’t about scaling elements—it’s about &lt;strong&gt;managing constraints effectively&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you’re working with Rows or Columns, use &lt;code&gt;Flexible&lt;/code&gt; or &lt;code&gt;Expanded&lt;/code&gt; to ensure children adjust to the space allowed by their parent widgets. Flutter's built-in layout widgets are great for  managing how much space each child takes.&lt;/p&gt;

&lt;p&gt;Take a look at this 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;Row&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;Flexible&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;Container&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="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;Flexible&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;Container&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;red&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;With &lt;code&gt;Flexible&lt;/code&gt;, the children are set to adjust their size based on the available space, ensuring they fill the Row without causing overflow issues. This way, you can avoid common layout problems while letting Flutter handle the details.&lt;/p&gt;

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

&lt;p&gt;To sum it up: &lt;strong&gt;responsiveness is about adapting your layout to the strengths of each device—not just making everything look the same.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Avoid the pitfalls of fractional sizing with &lt;code&gt;MediaQuery&lt;/code&gt; and, instead, let Flutter's layout widgets do the heavy lifting. Trust your constraints, leverage &lt;code&gt;Flexible&lt;/code&gt; and &lt;code&gt;Expanded&lt;/code&gt;, and design with &lt;code&gt;LayoutBuilder&lt;/code&gt; to create adaptive UIs.&lt;/p&gt;

&lt;p&gt;The next time you find yourself reaching for &lt;code&gt;MediaQuery&lt;/code&gt; to scale your widgets, take a step back. Think: is this making the most of the device's characteristics, or am I just trying to make everything look identical? Start building layouts that respect the user’s device, and your apps will be better for it.&lt;/p&gt;

&lt;p&gt;What’s holding you back from ditching fractional sizing today? Give it a go—your users (and future self) will thank you.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>dart</category>
      <category>programming</category>
    </item>
    <item>
      <title>Design Patterns vs. Architectural Patterns: Stop the Confusion</title>
      <dc:creator>Flutter with Caio</dc:creator>
      <pubDate>Fri, 11 Oct 2024 17:10:12 +0000</pubDate>
      <link>https://dev.to/flutterwithcaio/design-patterns-vs-architectural-patterns-stop-the-confusion-4nh2</link>
      <guid>https://dev.to/flutterwithcaio/design-patterns-vs-architectural-patterns-stop-the-confusion-4nh2</guid>
      <description>&lt;p&gt;Do you know the difference between design patterns and architectural patterns?&lt;/p&gt;

&lt;p&gt;If you're unsure about the answer, &lt;strong&gt;relax—you're not alone&lt;/strong&gt;. By the end of this, you'll know &lt;strong&gt;clear-cut difference&lt;/strong&gt;, and maybe you'll get a chance to show off your knowledge in a round of friends.&lt;/p&gt;

&lt;p&gt;However, if you want to be &lt;strong&gt;ahead of most developers&lt;/strong&gt;, this is a &lt;strong&gt;must&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Knowing when to use each can help you &lt;strong&gt;build applications faster&lt;/strong&gt; and make them &lt;strong&gt;easier to manage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's dive in and clear up the mystery.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Design Patterns?
&lt;/h2&gt;

&lt;p&gt;Design patterns are essential, reusable solutions to recurring &lt;strong&gt;coding&lt;/strong&gt; problems.&lt;/p&gt;

&lt;p&gt;They help &lt;strong&gt;solve smaller, specific problems&lt;/strong&gt; you often face &lt;strong&gt;during coding&lt;/strong&gt;—like managing object creation or decoupling components.&lt;/p&gt;

&lt;h3&gt;
  
  
  Categories of Design Patterns
&lt;/h3&gt;

&lt;p&gt;The concept of design patterns was popularized by the "Gang of Four" (GoF) in their classic book &lt;em&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In this book, they introduced three main categories of design patterns: Creational, Structural, and Behavioral.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Creational Patterns&lt;/strong&gt; provide techniques for creating objects in a flexible and controlled way, reducing complexity. Examples include &lt;strong&gt;Singleton&lt;/strong&gt; and &lt;strong&gt;Factory&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structural Patterns&lt;/strong&gt; help organize objects and classes to form larger, more efficient structures. Examples include &lt;strong&gt;Adapter&lt;/strong&gt; and &lt;strong&gt;Composite&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Behavioral Patterns&lt;/strong&gt; manage communication between objects to ensure flexible interactions. Examples include &lt;strong&gt;Observer&lt;/strong&gt; and &lt;strong&gt;Strategy&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over the past decades, new design patterns have been discovered as the software development landscape has evolved. Examples are &lt;strong&gt;Dependency Injection&lt;/strong&gt;, &lt;strong&gt;Event Sourcing&lt;/strong&gt;, and &lt;strong&gt;CQRS (Command Query Responsibility Segregation)&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Purpose and Benefits
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Solve coding problems&lt;/strong&gt; by providing targeted solutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make code consistent&lt;/strong&gt; by using common approaches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make components reusable&lt;/strong&gt; for efficient development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplifies the understanding of your team coworkers about your code&lt;/strong&gt; with common patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduce complexity&lt;/strong&gt; in specific parts of your code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  When to Use Design Patterns
&lt;/h3&gt;

&lt;p&gt;Design patterns are used during the &lt;strong&gt;coding phase&lt;/strong&gt; of development.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Architectural Patterns?
&lt;/h2&gt;

&lt;p&gt;Architectural patterns are essential, reusable solutions to recurring &lt;strong&gt;system-level&lt;/strong&gt; problems.&lt;/p&gt;

&lt;p&gt;While design patterns handle lower-level problems, &lt;strong&gt;architectural patterns&lt;/strong&gt; take a broader view.&lt;/p&gt;

&lt;p&gt;They focus on organizing your application's overall architecture—they’re the blueprints for how your system functions as a whole.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of Architectural Patterns
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layered Architecture&lt;/strong&gt; separates the system into layers like presentation, business logic, and data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MVC (Model-View-Controller)&lt;/strong&gt; organizes code to separate data, UI, and control logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microservices&lt;/strong&gt; split the system into smaller, independent services.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Purpose and Benefits
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Shape the system's structure&lt;/strong&gt; with high-level solutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make your project foundation scalable&lt;/strong&gt; so it's ready for growth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set clear boundaries&lt;/strong&gt; to make system management easier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve interactions&lt;/strong&gt; between different system parts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide stability&lt;/strong&gt; as your app evolves over time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  When to Use Architectural Patterns
&lt;/h4&gt;

&lt;p&gt;Architectural patterns are used during the &lt;strong&gt;planning phase&lt;/strong&gt;, before you even start coding, to shape how different parts of your system will interact.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Clear-Cut Differences You Need to Know
&lt;/h2&gt;

&lt;p&gt;You must have noted some differences between them already. Let's clarify these points.&lt;/p&gt;

&lt;h3&gt;
  
  
  Abstraction Level
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design Patterns&lt;/strong&gt; work at a &lt;strong&gt;low level&lt;/strong&gt; to solve specific &lt;strong&gt;implementation problems&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architectural Patterns&lt;/strong&gt; operate at a &lt;strong&gt;high level&lt;/strong&gt; to organize the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scope
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design Patterns&lt;/strong&gt; affect &lt;strong&gt;specific sections&lt;/strong&gt; of code.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Architectural Patterns&lt;/strong&gt; impact the &lt;strong&gt;entire system&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Development Stage
&lt;/h3&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design Patterns&lt;/strong&gt; are applied during the &lt;strong&gt;development stage&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architectural Patterns&lt;/strong&gt; are decided in the &lt;strong&gt;planning phase&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Imagine you're starting a project from scratch and need to figure out how to organize the entire system.&lt;/p&gt;

&lt;p&gt;You might decide to use &lt;strong&gt;MVC&lt;/strong&gt; (architectural pattern) to lay the foundation—breaking up the user interface, business logic, and data layer to keep everything organized and manageable as the project grows.&lt;/p&gt;

&lt;p&gt;During the coding phase, you come across a problem: you need to notify multiple parts of your app when an event happens.  &lt;/p&gt;

&lt;p&gt;This is where a design pattern like the &lt;strong&gt;Observer pattern&lt;/strong&gt; (design pattern) comes into play. It helps you efficiently update multiple views whenever data changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Are They So Easy to Confuse?
&lt;/h2&gt;

&lt;p&gt;It’s no wonder developers often confuse design and architectural patterns—they do have some similarities in practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminology Confusion
&lt;/h3&gt;

&lt;p&gt;Patterns like &lt;strong&gt;MVC&lt;/strong&gt; can be used as an architectural pattern or a design pattern, depending on the context.&lt;/p&gt;

&lt;p&gt;When structuring the entire system, MVC acts as an architectural pattern to organize components.&lt;/p&gt;

&lt;p&gt;When coding a specific feature, MVC can also serve as a design pattern to manage interactions in an OOP context between parts of that feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Same Goals
&lt;/h3&gt;

&lt;p&gt;Both design and architectural patterns are &lt;strong&gt;typical solutions to common problems&lt;/strong&gt;. When a solution is repeated across projects, it eventually gets a name and becomes a pattern.&lt;/p&gt;

&lt;p&gt;The key here is &lt;strong&gt;scope&lt;/strong&gt;: architectural patterns work on the macro level, while design patterns focus on the micro.&lt;/p&gt;




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

&lt;p&gt;So, now you know the difference between design patterns and architectural patterns.&lt;/p&gt;

&lt;p&gt;Not just the definition, but &lt;strong&gt;when and why to use each one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Remember, it’s not just about having the right tools, but &lt;strong&gt;knowing when to reach for each one&lt;/strong&gt;. Next time you're working on a project, take a second to think—is this a design pattern moment, or do you need to step back and consider the architecture?&lt;/p&gt;

&lt;p&gt;Mastering both approaches will make you &lt;strong&gt;develop systems better and faster&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ready to put this into practice and level up your skills? Start here and now. You've got this.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>oop</category>
      <category>devdiscuss</category>
    </item>
    <item>
      <title>Stop Using MediaQuery.of! Try These 15 More Efficient Alternatives Instead</title>
      <dc:creator>Flutter with Caio</dc:creator>
      <pubDate>Sun, 06 Oct 2024 18:47:41 +0000</pubDate>
      <link>https://dev.to/flutterwithcaio/stop-using-mediaqueryof-try-these-15-more-efficient-alternatives-instead-2ffj</link>
      <guid>https://dev.to/flutterwithcaio/stop-using-mediaqueryof-try-these-15-more-efficient-alternatives-instead-2ffj</guid>
      <description>&lt;p&gt;&lt;strong&gt;MediaQuery.of should no longer be a default tool in your Flutter toolbox.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why? Well, if you’ve been using &lt;code&gt;MediaQuery.of(context)&lt;/code&gt; religiously, you might be introducing unnecessary rebuilds into your app. This leads to inefficiencies that can slow down your app and cause performance hiccups, especially in complex UIs.&lt;/p&gt;

&lt;p&gt;Instead of falling into this trap, I’m going to show you 15 more efficient alternatives that will streamline your code and optimize your app’s performance.&lt;/p&gt;

&lt;p&gt;By the end of this article, you'll have learned how to write cleaner and more efficient Flutter code with the latest context-specific getters. Ready to optimize your app? Let’s dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is MediaQuery?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;MediaQuery&lt;/code&gt; is a class in Flutter that gives you access to essential device information such as screen size, device orientation, text scaling factor, and more. It’s often used in Flutter apps to make your UI adaptive across various devices.&lt;/p&gt;

&lt;p&gt;Some typical use cases of &lt;code&gt;MediaQuery&lt;/code&gt; include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Screen Size&lt;/strong&gt;: Detecting the device's width and height.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device Orientation&lt;/strong&gt;: Checking if the device is in portrait or landscape mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text Scaling&lt;/strong&gt;: Adjusting text size based on user preferences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insets (e.g., Keyboard)&lt;/strong&gt;: Knowing when the keyboard is shown or system bars are present.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark Mode Detection&lt;/strong&gt;: Identifying whether the system is in light or dark mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility Navigation&lt;/strong&gt;: Understanding if accessibility features, like VoiceOver, are active.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Animations&lt;/strong&gt;: Determining if users prefer reduced animations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But here's the problem: &lt;strong&gt;using &lt;code&gt;MediaQuery.of(context)&lt;/code&gt; can trigger widget rebuilds unnecessarily&lt;/strong&gt;, especially if you're using it across multiple widgets. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does this happen?&lt;/strong&gt; &lt;code&gt;MediaQuery.of(context)&lt;/code&gt; returns a &lt;code&gt;MediaQueryData&lt;/code&gt; object containing multiple device properties (e.g., screen size, orientation). When &lt;strong&gt;any&lt;/strong&gt; property in this object changes, Flutter rebuilds the widget, even if you're only using one specific property. This can cause unnecessary rebuilds and performance issues.&lt;/p&gt;

&lt;p&gt;It’s time to move beyond &lt;code&gt;MediaQuery.of&lt;/code&gt; and try these newer, more efficient alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  15 Better Alternatives to MediaQuery.of
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Retrieving Screen Size
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.sizeOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).size&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sizeOf&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="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;width&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;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;width:&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 80% of screen width&lt;/span&gt;
  &lt;span class="nl"&gt;height:&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 30% of screen height&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="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefit&lt;/strong&gt;: It rebuilds the widget only when the screen size changes.&lt;/p&gt;

&lt;p&gt;(For responsive layouts, a better option might be using &lt;code&gt;LayoutBuilder&lt;/code&gt;. Learn more on &lt;a href="https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html" rel="noopener noreferrer"&gt;https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;And if you want to avoid exceptions when no &lt;code&gt;MediaQuery&lt;/code&gt; ancestor exists, use &lt;code&gt;maybeSizeOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Device Orientation
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.orientationOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).orientation&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;orientation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orientationOf&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;orientation&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Orientation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;portrait&lt;/span&gt;
  &lt;span class="o"&gt;?&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;children:&lt;/span&gt; &lt;span class="p"&gt;[...])&lt;/span&gt;
  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Row&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefit&lt;/strong&gt;: Rebuilds only when the device orientation changes.&lt;/p&gt;

&lt;p&gt;For cases without a &lt;code&gt;MediaQuery&lt;/code&gt; ancestor, use &lt;code&gt;maybeOrientationOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Text Scaling Factor
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.textScalerOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).textScaleFactor&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;textScaleFactor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textScalerOf&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="k"&gt;return&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;'Responsive Text'&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;16&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;textScaleFactor&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;Benefit&lt;/strong&gt;: It listens only to changes in the text scaling factor, preventing unnecessary rebuilds.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;maybeTextScalerOf(context)&lt;/code&gt; if you don’t want it to throw an error.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. System Padding (Insets)
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.viewInsetsOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).viewInsets&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;insets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;viewInsetsOf&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;padding:&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;only&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;bottom:&lt;/span&gt; &lt;span class="n"&gt;insets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bottom&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;TextField&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;Benefit&lt;/strong&gt;: Reacts only when insets like the keyboard visibility change.&lt;/p&gt;

&lt;p&gt;For a null-safe alternative, use &lt;code&gt;maybeViewInsetsOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Dark Mode Detection (Brightness)
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.platformBrightnessOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).platformBrightness&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;brightness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;platformBrightnessOf&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;brightness&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Brightness&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;
  &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;ThemeData&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="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ThemeData&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefit&lt;/strong&gt;: Rebuilds only when the system changes between dark and light mode.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;maybePlatformBrightnessOf(context)&lt;/code&gt; for additional safety.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Handling Accessibility Navigation
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.accessibleNavigationOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).accessibleNavigation&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;accessibleNavigation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessibleNavigationOf&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;accessibleNavigation&lt;/span&gt;
  &lt;span class="o"&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;'VoiceOver is enabled'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&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;'Normal mode'&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;Benefit&lt;/strong&gt;: Detects accessibility navigation changes without triggering unwanted rebuilds.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;maybeAccessibleNavigationOf(context)&lt;/code&gt; to return null when no &lt;code&gt;MediaQuery&lt;/code&gt; ancestor is found.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Handling Device Pixel Ratio
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.devicePixelRatioOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).devicePixelRatio&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;pixelRatio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;devicePixelRatioOf&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;width:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pixelRatio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;height:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pixelRatio&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;Benefit&lt;/strong&gt;: Updates only when the pixel density changes.&lt;/p&gt;

&lt;p&gt;For a null-safe version, use &lt;code&gt;maybeDevicePixelRatioOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Handling Bold Text Accessibility
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.boldTextOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).boldText&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;boldText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;boldTextOf&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="k"&gt;return&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;'Accessible Text'&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;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;boldText&lt;/span&gt; &lt;span class="o"&gt;?&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="o"&gt;:&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;normal&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;Benefit&lt;/strong&gt;: Detects changes in bold text accessibility without unnecessary rebuilds.&lt;/p&gt;

&lt;p&gt;For safer handling, use &lt;code&gt;maybeBoldTextOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Detecting Animation Preferences
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.disableAnimationsOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).disableAnimations&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;disableAnimations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;disableAnimationsOf&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;disableAnimations&lt;/span&gt;
  &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AnimatedOpacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;opacity:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;duration:&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;2&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;'Animation'&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;Benefit&lt;/strong&gt;: Rebuilds the widget only when the user’s animation preferences change.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;maybeDisableAnimationsOf(context)&lt;/code&gt; for null safety.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Detecting High Contrast Mode
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.highContrastOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).highContrast&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;highContrast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;highContrastOf&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;highContrast&lt;/span&gt;
  &lt;span class="o"&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;'High Contrast Text'&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;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;black&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="o"&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;'Normal Contrast Text'&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;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;grey&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;Benefit&lt;/strong&gt;: Updates only when high contrast mode changes.&lt;/p&gt;

&lt;p&gt;For a null-safe version, use &lt;code&gt;maybeHighContrastOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Handling Inverted Colors
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.invertColorsOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).invertColors&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;invertColors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invertColorsOf&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;ColorFiltered&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;colorFilter:&lt;/span&gt; &lt;span class="n"&gt;invertColors&lt;/span&gt;
    &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;ColorFilter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&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;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BlendMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;difference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ColorFilter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&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;transparent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BlendMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;multiply&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;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'image.png'&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;Benefit&lt;/strong&gt;: Reacts only when color inversion changes.&lt;/p&gt;

&lt;p&gt;For null safety, use &lt;code&gt;maybeInvertColorsOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. Handling Gesture Settings
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.gestureSettingsOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).gestureSettings&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;gestureSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gestureSettingsOf&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;gestureSettings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;touchSlop&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="o"&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;'Gesture Detected'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&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;'No Gesture Detected'&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;Benefit&lt;/strong&gt;: Listens for changes in gesture settings without triggering unnecessary rebuilds.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;maybeGestureSettingsOf(context)&lt;/code&gt; if you need null safety.&lt;/p&gt;

&lt;h3&gt;
  
  
  13. Detecting Display Features
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.displayFeaturesOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).displayFeatures&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;displayFeatures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayFeaturesOf&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;displayFeatures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotEmpty&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;'Cutout Detected'&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'No Cutout'&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;Benefit&lt;/strong&gt;: Updates only when display features like cutouts or foldables change.&lt;/p&gt;

&lt;p&gt;For null safety, use &lt;code&gt;maybeDisplayFeaturesOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  14. Handling System Padding
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.paddingOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).padding&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;padding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paddingOf&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;padding:&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="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;top&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;'Padded Text'&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;Benefit&lt;/strong&gt;: Rebuilds only when system UI padding changes.&lt;/p&gt;

&lt;p&gt;To avoid exceptions, use &lt;code&gt;maybePaddingOf(context)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  15. Detecting System Gesture Insets
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;MediaQuery.systemGestureInsetsOf(context)&lt;/code&gt; instead of &lt;code&gt;MediaQuery.of(context).systemGestureInsets&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&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;systemGestureInsets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;systemGestureInsetsOf&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;padding:&lt;/span&gt; &lt;span class="n"&gt;systemGestureInsets&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;'Gesture Insets Applied'&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;Benefit&lt;/strong&gt;: Reacts only when system gesture insets change.&lt;/p&gt;

&lt;p&gt;For a safer implementation, use &lt;code&gt;maybeSystemGestureInsetsOf(context)&lt;/code&gt;.&lt;/p&gt;




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

&lt;p&gt;There you have it! 15 better alternatives to using &lt;code&gt;MediaQuery.of(context)&lt;/code&gt; that can significantly improve your app’s performance by preventing unnecessary widget rebuilds. These new methods are more specific and efficient, and they’ll help you build Flutter apps with ease.&lt;/p&gt;

&lt;p&gt;Try them out and let me know how they work for you! As always, feel free to reach out if you have any questions or want to share your results. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
      <category>programming</category>
    </item>
    <item>
      <title>6 Critical Flutter Development Mistakes That Cause App Crashes (and How to Avoid Them)</title>
      <dc:creator>Flutter with Caio</dc:creator>
      <pubDate>Thu, 03 Oct 2024 17:43:51 +0000</pubDate>
      <link>https://dev.to/flutterwithcaio/6-critical-flutter-development-mistakes-that-cause-app-crashes-and-how-to-avoid-them-1ie3</link>
      <guid>https://dev.to/flutterwithcaio/6-critical-flutter-development-mistakes-that-cause-app-crashes-and-how-to-avoid-them-1ie3</guid>
      <description>&lt;p&gt;The most common cause of app crashes is simple mistakes that developers often ignore.&lt;/p&gt;

&lt;p&gt;You’ve been there. You launch your Flutter app, excited to see it in action—only to have it crash right before your eyes. Frustrating, right?&lt;/p&gt;

&lt;p&gt;App crashes are the silent killer of user satisfaction. A single crash can make users abandon your app and, as a developer, nothing feels worse than hours of hard work unraveling in a few seconds.&lt;/p&gt;

&lt;p&gt;The good news? Most crashes are preventable.&lt;/p&gt;

&lt;p&gt;Here are six common Flutter development mistakes that lead to crashes—and more importantly, how you can avoid them. &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Neglecting Error Handling in Async Operations
&lt;/h2&gt;

&lt;p&gt;One of the most common Flutter mistakes? Ignoring error handling in asynchronous operations. Silent failures in async functions can result in crashes without clear explanations.&lt;/p&gt;

&lt;p&gt;For instance, imagine you're calling an API, and the request fails:&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;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;fetchData&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;await&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'https://example.com/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;p&gt;Here’s the problem: if the request fails, nothing is caught. The app will crash, and the user will see nothing. To fix this, you should &lt;strong&gt;always&lt;/strong&gt; handle errors with a &lt;code&gt;try-catch&lt;/code&gt; block:&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;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;fetchData&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;try&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'https://example.com/data'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Handle the error&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;'Error fetching data: &lt;/span&gt;&lt;span class="si"&gt;$e&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By handling errors properly, you can display a friendly message to your users instead of letting the app crash.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Using Heavy Build Methods with Complex UI
&lt;/h2&gt;

&lt;p&gt;A common cause of performance dips or crashes is placing too much logic inside the &lt;code&gt;build()&lt;/code&gt; method, especially for complex UIs. This leads to unnecessary re-renders, causing slow performance and potential crashes.&lt;/p&gt;

&lt;p&gt;Here’s an example of an overloaded &lt;code&gt;build()&lt;/code&gt; method:&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="nd"&gt;@override&lt;/span&gt;
&lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="nf"&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;Column&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="n"&gt;fetchDataFromApi&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="c1"&gt;// Complex logic here&lt;/span&gt;
      &lt;span class="n"&gt;HeavyWidget&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// Another performance-heavy widget&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;Instead, keep your &lt;code&gt;build()&lt;/code&gt; methods lightweight by moving complex logic to helper functions, controllers, or state management solutions. Also, use the &lt;code&gt;const&lt;/code&gt; keyword wherever possible to optimize rebuilds:&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="nd"&gt;@override&lt;/span&gt;
&lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="nf"&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;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="n"&gt;SimpleWidget&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// Using const here improves performance&lt;/span&gt;
      &lt;span class="n"&gt;HeavyWidget&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;By keeping your build methods lean, you’ll ensure your UI remains smooth and responsive.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Overloading the Main Thread with Heavy Operations
&lt;/h2&gt;

&lt;p&gt;Blocking the main thread by running heavy operations on it can lead to frozen UIs and frustrated users. For example, reading a large file directly on the main thread is a recipe for disaster:&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="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;readLargeFile&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;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'large_file.txt'&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;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAsStringSync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Blocking operation&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contents&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;Instead, you can offload this operation to a background thread using Flutter’s &lt;code&gt;compute()&lt;/code&gt; function:&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;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;readLargeFile&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;contents&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;compute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_readFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'large_file.txt'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;_readFile&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;path&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;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&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;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAsStringSync&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;This way, you keep the UI thread responsive while performing the heavy file operation in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Ignoring Proper Memory Management with Streams
&lt;/h2&gt;

&lt;p&gt;Streams are fantastic for handling data in Flutter, but failing to close them properly can cause memory leaks, leading to crashes over time. A common mistake is forgetting to close streams when they’re no longer needed:&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;StreamSubscription&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_subscription&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;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;_subscription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Do something with data&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="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Forgetting to close the stream!&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;dispose&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;Make sure you close your streams:&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="nd"&gt;@override&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;_subscription&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cancel&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;dispose&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;This prevents unnecessary memory buildup and ensures your app stays stable.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Overusing Global Variables Across the App
&lt;/h2&gt;

&lt;p&gt;Global variables might seem like a quick solution, but overusing them creates conflicts and hard-to-track crashes. Here’s an example of global overuse:&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;globalCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of using global variables, a better solution is to implement Dependency Injection (DI) like &lt;code&gt;Provider&lt;/code&gt; or use service locators like &lt;code&gt;get_it&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Here’s how you can use &lt;code&gt;Provider&lt;/code&gt; for 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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&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;'Doing something'&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="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;MultiProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;providers:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;create:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&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;MyService&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="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="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;MyHomePage&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="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;myService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyService&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="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;'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;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;myService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;doSomething&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="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Call Service'&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;Using DI or service locators keeps your codebase clean and helps avoid the chaotic behavior that globals can introduce.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Skipping Comprehensive Testing on Different Platforms
&lt;/h2&gt;

&lt;p&gt;Testing your Flutter app only on a single platform is a recipe for disaster. Flutter runs on iOS, Android, Web, and more, but platform-specific quirks can cause crashes if you don’t test thoroughly.&lt;/p&gt;

&lt;p&gt;For example, file paths may work differently on iOS versus Android. Make sure to write platform-aware code:&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Platform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isAndroid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Handle Android-specific logic&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Platform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isIOS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Handle iOS-specific logic&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To avoid platform-specific crashes, test on all target platforms and use Flutter’s &lt;code&gt;Device Preview&lt;/code&gt; to catch potential issues early.&lt;/p&gt;




&lt;h2&gt;
  
  
  That's it!
&lt;/h2&gt;

&lt;p&gt;By avoiding these six common Flutter mistakes, you’ll reduce crashes, optimize performance, and deliver a smooth experience for your users.&lt;/p&gt;

&lt;p&gt;Your app deserves to shine—and it will, with a few careful tweaks.&lt;/p&gt;

&lt;p&gt;Ready to take your Flutter skills to the next level? Start refactoring today, and feel free to reach out with any questions.&lt;/p&gt;

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