void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); }
WidgetFlutterBinding
是用来与Flutter 引擎交互的
Firebase.initializeApp()
需要调用本机代码来初始化Firebase,并且由于插件需要使用平台通道来调用本机代码(这是异步完成的),因此您必须调用ensureInitialized()
来确保您拥有WidgetsBinding
的实例
WidgetsFlutterBinding 的源码, 一个简单的单例
/// A concrete binding for applications based on the Widgets framework. /// /// This is the glue that binds the framework to the Flutter engine. /// /// When using the widgets framework, this binding, or one that /// implements the same interfaces, must be used. The following /// mixins are used to implement this binding: /// /// * [GestureBinding], which implements the basics of hit testing. /// * [SchedulerBinding], which introduces the concepts of frames. /// * [ServicesBinding], which provides access to the plugin subsystem. /// * [PaintingBinding], which enables decoding images. /// * [SemanticsBinding], which supports accessibility. /// * [RendererBinding], which handles the render tree. /// * [WidgetsBinding], which handles the widget tree. class WidgetsFlutterBinding extends BindingBase with GestureBinding, SchedulerBinding, ServicesBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding { /// Returns an instance of the binding that implements /// [WidgetsBinding]. If no binding has yet been initialized, the /// [WidgetsFlutterBinding] class is used to create and initialize /// one. /// /// You only need to call this method if you need the binding to be /// initialized before calling [runApp]. /// /// In the `flutter_test` framework, [testWidgets] initializes the /// binding instance to a [TestWidgetsFlutterBinding], not a /// [WidgetsFlutterBinding]. See /// [TestWidgetsFlutterBinding.ensureInitialized]. static WidgetsBinding ensureInitialized() { if (WidgetsBinding._instance == null) { WidgetsFlutterBinding(); } return WidgetsBinding.instance; } }