Flutter packages
The UzMaps mobile apps are not a monolith. They are four published packages on pub.dev, layered so you can take as much or as little as you want — from a design system to a complete, working map application in an afternoon. Every layer is used by the UzMaps app itself, so nothing here is sample code that was never shipped.
| Package | pub.dev | What it gives you |
|---|---|---|
uzmaps_core | {{PKG_VER:flutter-core}} | Design tokens, the motion engine, four-language strings, geo and formatting helpers, async plumbing, on-device stores. Zero third-party dependencies. |
uzmaps_api | {{PKG_VER:flutter-api}} | Typed client for the whole UzMap HTTP API: search, places, routing, photos, status — with retry, TTL cache and typed failures. |
uzmaps_ui | {{PKG_VER:flutter-ui}} | The UzMaps design system: Material 3 theme from brand tokens, buttons, cards, sheets, toasts, skeletons, state views. |
uzmaps_kit | {{PKG_VER:flutter-kit}} | The map experience itself: MapLibre engine, app controller and every screen — search, place, route, navigation, saved places, trips, settings, status. |
There are matching TypeScript packages for the web — @uzmaps/engine,
@uzmaps/api and @uzmaps/ui — speaking the same API with the same
conventions, so a product built on both platforms behaves identically.
The layering#
Each package depends only on the ones above it in this list:
uzmaps_kit screens, map engine, app controller
↑
uzmaps_ui theme and components
↑
uzmaps_api HTTP client and models
↑
uzmaps_core tokens, motion, strings, geo, storesThat bottom layer is deliberately dependency-free. No state-management framework, no DI container, no
plugin native code — uzmaps_core is one SDK dependency, which means your upgrade path never routes
through somebody else's breaking change.
A map in twenty lines#
Compose uzmaps_api + uzmaps_kit and you have a working, themeable map with search:
import 'package:flutter/material.dart';
import 'package:uzmaps_api/uzmaps_api.dart';
import 'package:uzmaps_kit/uzmaps_kit.dart';
import 'package:uzmaps_ui/uzmaps_ui.dart';
Future<void> main() async {
final api = UzMapClient(ApiConfig(
serverUrl: 'https://uzmaps.uz',
apiKey: 'YOUR_KEY',
languageKey: 'uz',
));
final engine = UzMapEngine(api: api);
runApp(UzThemeProvider(
child: MaterialApp(
theme: UzTheme.light(),
darkTheme: UzTheme.dark(),
home: Scaffold(
body: UzMapView(
engine: engine,
dark: false,
styleUrl: api.styleUrl(dark: false),
myLocationEnabled: true,
),
),
),
));
}The UzMapView carries every production fix the UzMaps apps earned on real devices — Android texture
quirks, style-reload races, camera jank — so you inherit them instead of rediscovering them.
What you can build with the stack#
- A map app —
uzmaps_kit's controller and screens are the ones the UzMaps app ships with: search with autocomplete, place pages with photos and opening hours, turn-by-turn routing, saved places, a trip journal, settings and a live status dashboard. - A design system — take
uzmaps_core+uzmaps_uialone and you have tokens, motion primitives, skeletons and components that match the UzMaps look without any map code at all. - A data client —
uzmaps_apiin a service, a CLI or a background worker: pure Dart, one dependency.
Getting the keys#
Everything talks to the same HTTP API as the web SDK. Create a project and key in the developer console, restrict browser keys by origin and mobile keys by package, and you are done — see API keys and quotas.
Attribution#
Map data © OpenStreetMap contributors, ODbL. The map engine renders the attribution behind the ⓘ button; if you draw the map yourself, display the credits yourself — the full list lives under Data sources.