ZGS GIS Platform — Flutter Web with an embedded ArcGIS map
Context
Power-line and infrastructure construction projects need serious geospatial tooling — and the rest of an enterprise app around it: dashboards, HSE incident reporting, permit tracking, supplier assignments, document versioning. Eight feature modules, one platform, German enterprise users.
The hard architectural call: don't reimplement ArcGIS
The app is Flutter Web. The mapping requirement was ArcGIS, whose real capability lives in its JavaScript API. Two options:
- Wrap ArcGIS in Dart. Keeps one language and one build. But you inherit the maintenance of a binding layer for an API surface you don't control, and you're always behind its releases.
- Embed the real React/ArcGIS build inside the Flutter shell. Two build systems, one boundary to manage — but the map is the actual ArcGIS product, not an approximation of it.
I chose to embed. The reasoning: the map is the product here. Being one ArcGIS release behind on a feature the client asked for is a worse failure than the complexity of a boundary I define and control.
The bridge
The Flutter shell and the embedded map communicate over a two-way postMessage bridge
carrying exactly two things:
- Auth token handoff — the map inherits the session rather than authenticating separately. One login, one identity.
- Live map filtering — filter state changes in the Flutter UI push to the map without a reload.
Keeping the bridge to a deliberately narrow contract is what makes this maintainable. A bridge that grows to proxy arbitrary calls becomes a distributed system with no schema.
Auth and networking
Microsoft Azure AD single sign-on, with a Dio interceptor performing automatic token refresh — transparent to every call site, so no feature module contains auth retry logic. A shared REST client maps wire failures to typed exceptions once.
Presentation
DE/EN localization, light and dark theming, adaptive layouts across four breakpoints. Deployed via Firebase Hosting with Cloud Functions against an Azure-hosted API — a deliberately boring hosting choice for a decidedly non-boring frontend.
Stack
Flutter Web · Dart · ArcGIS JS API · Azure AD (OAuth 2.0) · Dio · Provider/GetIt/GetX · go_router · fl_chart · Firebase Hosting & Cloud Functions · REST on Azure