<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Syed Zubyl N | Software Developer - UI&#x2F;UX</title>
      <link>https://syedzubyl.space</link>
      <description>Syed Zubyl N — Software Developer focused on Java, Spring Boot, backend development, REST APIs, databases, Flutter and production-oriented applications.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://syedzubyl.space/tags/ui-ux/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 10 Jan 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Android App Bar Compatibility: When Client Requirements Meet Platform Defaults</title>
          <pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate>
          <author>Syed Zubyl N</author>
          <link>https://syedzubyl.space/blog/android-app-bar-compatibility/</link>
          <guid>https://syedzubyl.space/blog/android-app-bar-compatibility/</guid>
          <description xml:base="https://syedzubyl.space/blog/android-app-bar-compatibility/">&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;&#x2F;h3&gt;
&lt;p&gt;During a recent project, a client expected a highly specific app-bar appearance. The request was straightforward on paper: make the Flutter application look exactly like an Android-native&#x2F;default implementation, matching a specific older Android version’s aesthetic they were used to.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;context&quot;&gt;Context&lt;&#x2F;h3&gt;
&lt;p&gt;When building cross-platform applications with Flutter, the framework paints every pixel on the screen using its own rendering engine (Skia&#x2F;Impeller). It does not use OEM native widgets. While Flutter’s Material widgets do an incredible job of mimicking native Android components, they default to the current Material Design guidelines (Material 3). The client, however, wanted an exact replica of an older Android native app bar behavior and shadowing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-tried&quot;&gt;What I Tried&lt;&#x2F;h3&gt;
&lt;p&gt;I initially tried overriding the &lt;code&gt;AppBar&lt;&#x2F;code&gt; theme properties:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt;AppBar&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  elevation&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; 4.0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  shadowColor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; Colors&lt;&#x2F;span&gt;&lt;span&gt;.black.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B392F0;&quot;&gt;withOpacity&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt;0.5&lt;&#x2F;span&gt;&lt;span&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  backgroundColor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; Theme&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B392F0;&quot;&gt;of&lt;&#x2F;span&gt;&lt;span&gt;(context).primaryColor,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  title&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;: const&lt;&#x2F;span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; Text&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9ECBFF;&quot;&gt;&amp;#39;Dashboard&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This got us close, but the exact gradient of the shadow and the specific typographic alignment didn’t perfectly match the legacy Android native view the client had side-by-side on their device.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-failed&quot;&gt;What Failed&lt;&#x2F;h3&gt;
&lt;p&gt;Attempting to perfectly mimic a deprecated OEM native view using a modern cross-platform framework’s rendering engine became a game of diminishing returns. I tried building a completely custom &lt;code&gt;PreferredSizeWidget&lt;&#x2F;code&gt; with complex box shadows, but it felt brittle.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-worked-technical-explanation&quot;&gt;What Worked &amp;amp; Technical Explanation&lt;&#x2F;h3&gt;
&lt;p&gt;The solution was a conversation rather than a code hack. The requested result could not be reproduced exactly with the existing implementation constraints without completely changing the approach or hardcoding fragile design values.&lt;&#x2F;p&gt;
&lt;p&gt;I explained to the client the difference between native Android UI conventions (which vary wildly between Android 10, 12, and 14) and Flutter’s unified rendering model. I demonstrated how adhering to Flutter’s Material 3 defaults actually provided &lt;em&gt;better&lt;&#x2F;em&gt; compatibility and visual consistency across all modern Android devices, rather than forcing an older, device-specific look.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lessons-learned&quot;&gt;Lessons Learned&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Client expectations vs. platform realities:&lt;&#x2F;strong&gt; Clients often don’t know the difference between a “native default” and a “custom design.” To them, what they see on their personal phone is the “default.”&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Push back with technical reasoning:&lt;&#x2F;strong&gt; Instead of spending hours tweaking pixel-perfect shadows to match an outdated OS, it’s better to explain the benefits of modern platform defaults.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;what-i-would-do-differently&quot;&gt;What I Would Do Differently&lt;&#x2F;h3&gt;
&lt;p&gt;Next time, I will establish the baseline UI components using Flutter’s default Material 3 implementation during the very first design review, ensuring the client signs off on the framework’s native look before development begins.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
