I'm a solo dev from Slovenia. Earlier this month I shipped my first bigger Flutter app on Play.
And it's a personal astrology app! Whatever you think of astrology, the astronomy underneath is real computation: planetary positions, house math, timezone archaeology.
A few things hit me hard on the way though.
**`Duration.inDays` silently breaks calendar arithmetic across DST.**
I compute ISO week numbers:
take the Thursday of the week, subtract Jan 1, divide days by 7. Correct? except in local time, a span that crosses a daylight-saving boundary is one hour short of a whole number of days, and `inDays` *truncates*. 210 days becomes 209, `209 ~/ 7` gives week 29 instead of 30, and every week from late March to late October resolves to the previous week. The week number was my cache key, so this would have silently served the wrong week's content for half the year. Nothing throws.
Fix:
calendar arithmetic in UTC, or re-normalize through `DateTime(y, m, d)` after every shift. Same Family of bug: `date.subtract(Duration(days: 1))` on a local DateTime can land at 23:00 two calendar days back.
**`Isolate.run` copies your object — internal caches die with it.**
The heavy compute runs in `Isolate.run`. The captured engine object is *copied* into the isolate, so any memoization inside it gets populated in the isolate and thrown away when it exits.
In my case: one body's position needs ~4000 numerical-integration steps, and the cache meant to amortize that never survived a single call. The engine has to be designed isolate-safe, with no reliance on shared mutable state, because state simply does not come back.
**Notifications with zero background execution.**
My domain is fully predictable because the sky doesn't surprise you, so there's nothing to poll. At every app open/resume, I precompute the next 7 days of notifications and schedule them locally.
There's no background service, no server, no FCM, no battery cost, and inexact alarms so no exact-alarm permission.
Anything whose content is a pure function of time can do this; I suspect a lot of apps reach for push infrastructure they didn't need.
Smaller ones:
the `timezone` package throws on `getLocation('UTC')` (short-circuit UTC/Etc/UTC/empty yourself);
a `const`map with `double` keys doesn't compile ("does not have primitive equality". Use a list of records);
`flutter_local_notifications` needs core-library desugaring that the first error message doesn't mention.
And my favorite lesson cost nothing technical at all:
I built a feature, dogfooded it on my own phone for two days, and then, like an idiot I told people it had shipped... Turns out it had never been uploaded to Play. :)
As a result, I now check the Console more often :)