Three passes that make any Flutter app feel considered: a real theme, readable and accessible screens, and a loading moment that doesn't flash or stall.
If colors and fonts are set inline on individual widgets right now, move them all into one ThemeData. One seed color, passed through ColorScheme.fromSeed, generates an entire accessible palette — primary, surface, error and the rest — so there's no hand-picking ten colors that need to work together.
Spacing works the same way. Define a small scale once, and use it everywhere instead of scattering 16, 15, 18 across files — consistent spacing does more for a polished feel than almost anything else.
Migrate screen by screen: replace hardcoded Color(0xFF...) and one-off TextStyles with Theme.of(context) references as you touch each file.
ColorScheme.fromSeedtextTheme, none inlineWrap any icon-only button in a Tooltip — icon-only AppBar actions, a bare FAB, disabled buttons that should say why they're disabled.
For text: keep body copy at 14sp minimum, check contrast against the background (4.5:1 for body text, 3:1 for large text), and never rely on color alone for meaning — pair red or green states with an icon or label too.
Anything visually abbreviated should still read naturally to a screen reader:
Keep the flow simple: main() → SplashScreen → (real init work) → HomeScreen. Use the wait to do actual work — precache images, load preferences, check auth state — not just a timer.
Flutter apps have a blank gap before Dart even starts — the flutter_native_splash package covers that gap natively, so the logo shows before your Dart splash screen ever mounts.
Future.delayed alonepushReplacement, so back doesn't return to itAppTheme and wire it into MaterialApp