flutter_services_binding
A subset of WidgetsFlutterBinding
specifically for initializing the ServicesBinding
.
When executing runApp
within a custom Zone
with zoneValues
derived from the underlying platform we rely on WidgetsFlutterBinding.ensureInitialized()
:
final token = Object();
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final value = await _getPlatformValue();
runZoned(
() => runApp(MyApp()),
zoneValues: {token: value},
);
}
This appears to work as expected, however, because WidgetsFlutterBinding
also initializes other bindings like GestureBinding
the zoneValue
is not accessible within onPressed
callbacks:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
print(Zone.current[token]); // OK
return MaterialApp(
home: Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
print(Zone.current[token]); // NULL
},
child: Text('Click Me'),
),
),
),
);
}
}
FlutterServicesBinding
provides an API to initialize the ServicesBinding
and SchedulerBinding
independently of the remaining bindings in order to support accessing data from the underlying platform before runApp
but without initializing the WidgetsBinding
instance within the root Zone
.
final token = Object();
void main() async {
FlutterServicesBinding.ensureInitialized();
final value = await _getPlatformValue();
runZoned(
() => runApp(MyApp()),
zoneValues: {token: value},
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
print(Zone.current[token]); // OK
return MaterialApp(
home: Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
print(Zone.current[token]); // OK
},
child: Text('Click Me'),
),
),
),
);
}
}
Libraries
- flutter_services_binding
- A subset of
WidgetsFlutterBinding
specifically forServicesBinding
.