configwire_flutter
Flutter companion to the pure-Dart configwire client
(fetch, cache, typed getters, realtime).
One call supplies the two Flutter-specific pieces the pure-Dart client
cannot provide on its own: a SharedPreferencesAsync-backed CacheStore
and device-derived Targeting. Everything else behaves exactly as
documented in the configwire package.
Install
Once published:
flutter pub add configwire_flutter
Or pin it in your pubspec.yaml:
dependencies:
configwire_flutter: ^0.1.0
Then flutter pub get.
Usage
The snippet below matches example/main.dart. Copy, paste, run.
It stays offline (ensureInitialized: false), so it needs no server.
On a real device drop that line (default true) to load the cache
plus force-fetch on startup.
import 'package:configwire_flutter/configwire_flutter.dart';
/// Offline-first demo: `ensureInitialized: false` means no network, so this
/// runs in CI with no server. On a real device drop that line (default true)
/// to load the cache plus force-fetch on startup.
Future<void> main() async {
final cw = await ConfigWireFlutter.createConfigWire(
apiKey: 'YOUR_SDK_KEY', // sent as X-ConfigWire-Key, never printed
env: 'dev',
baseUrl: 'http://127.0.0.1:8090',
defaults: {'launch_flag': false},
customAttrs: {'plan': 'pro'},
ensureInitialized: false,
);
assert(cw.getBool('launch_flag') == false);
// NOTE: values printed, apiKey never printed.
// ignore: avoid_print
print(
'launch_flag=${cw.getBool('launch_flag')} targeting=${cw.targeting}',
);
await cw.dispose();
}
createConfigWirereturns a plainconfigwireConfigWire. Read more in theconfigwirepackage: reading values, variants, fetch lifecycle, realtime, analytics, logging, and cache.
Targeting
Targeting attributes are sent as fetch query params so the server can
evaluate rules per fetch. Collection is automatic
(package_info_plus; locale needs no extra dependency).
Targeting stays sticky through
cw.setTargeting / cw.updateTargeting exactly as in configwire.
Default targeting (every fetch carries these unless empty, in which case the param is omitted):
| Field | Query param | Default value | Source |
|---|---|---|---|
userId |
?uid= |
Stable install ID: a 15-char lowercase [a-z0-9] ID, generated once and persisted. Customize the first-run value only via idGenerator (default defaultIdGenerator); '' stays anonymous and pins nothing |
SharedPreferencesAsync (+ idGenerator) |
platform |
?platform= |
android | ios | macos | windows | linux | fuchsia | web (kIsWeb forces web) |
defaultTargetPlatform |
appVersion |
?appVersion= |
Package version with +build metadata stripped for strict-semver compare (e.g. 1.0.0+1 → 1.0.0); empty (omitted) when unreadable |
package_info_plus |
locale |
?locale= |
toLanguageTag (e.g. en-US); empty (omitted) when unreadable |
PlatformDispatcher.locale |
country |
?country= |
countryCode (e.g. US); empty (omitted) when absent or unreadable |
PlatformDispatcher.locale |
customAttrs |
?attrs= (compact JSON) |
{} (omitted) unless passed via createConfigWire(customAttrs:) |
Caller input |
License
MIT — Copyright (c) 2026 Lam Thanh Nhan. See LICENSE.