Abh*_*ire 46 dart firebase flutter
我正在尝试使用带有以下代码行的 Firebase 包。
我真的很想知道这行代码实际上是做什么的?
官方文档对我帮助不大。有人可以解释一下吗?
Pet*_*dad 57
您必须以这种方式使用它:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
https://flutter.dev/docs/resources/architectural-overview#architectural-layers
上图是 Flutter 的架构层,WidgetFlutterBinding用于与 Flutter 引擎进行交互。Firebase.initializeApp()需要调用本机代码来初始化 Firebase,并且由于插件需要使用平台通道来调用本机代码,这是异步完成的,因此您必须调用ensureInitialized()以确保您拥有WidgetsBinding.
从文档:
返回 WidgetsBinding 的一个实例,必要时创建并初始化它。如果创建了一个,它将是一个 WidgetsFlutterBinding。如果之前已初始化,那么它至少会实现 WidgetsBinding。
如果您需要在调用 runApp 之前初始化绑定,则只需调用此方法。
从源代码:
@override
Future<FirebaseAppPlatform> initializeApp(
{String name, FirebaseOptions options}) async {
if (name == defaultFirebaseAppName) {
throw noDefaultAppInitialization();
}
// Ensure that core has been initialized on the first usage of
// initializeApp
if (!isCoreInitialized) {
await _initializeCore();
}
// If no name is provided, attempt to get the default Firebase app instance.
// If no instance is available, the user has not set up Firebase correctly for
// their platform.
if (name == null) {
MethodChannelFirebaseApp defaultApp =
appInstances[defaultFirebaseAppName];
if (defaultApp == null) {
throw coreNotInitialized();
}
return appInstances[defaultFirebaseAppName];
}
assert(options != null,
"FirebaseOptions cannot be null when creating a secondary Firebase app.");
// Check whether the app has already been initialized
if (appInstances.containsKey(name)) {
throw duplicateApp(name);
}
_initializeFirebaseAppFromMap(await channel.invokeMapMethod(
'Firebase#initializeApp',
<String, dynamic>{'appName': name, 'options': options.asMap},
));
return appInstances[name];
}
Run Code Online (Sandbox Code Playgroud)
在invokeMapMethod将调用一个方法上用指定的参数在上述信道,然后将调用initializeApp()方法中的本机代码,
https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_core/firebase_core/android/src /main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java#L227
还有多种初始化 Firebase 的方法,您可以在此处查看:
尚未创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()
在其他方式中我们不调用,WidgetsFlutterBinding.ensureInitialized()因为runApp()函数在内部调用它:
void runApp(Widget app) {
WidgetsFlutterBinding.ensureInitialized()
..scheduleAttachRootWidget(app)
..scheduleWarmUpFrame();
}
Run Code Online (Sandbox Code Playgroud)
Mos*_*oud 25
一个简单的答案,如果您的主函数使用 async 关键字,您需要使用这一行,因为您在其中使用了 wait 语句。
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance(); // just an example
}
Run Code Online (Sandbox Code Playgroud)
一个简单的答案是,如果 Flutter 在调用 runApp 之前需要调用原生代码
WidgetsFlutterBinding.ensureInitialized();
确保您有一个 WidgetsBinding 的实例,这是使用平台通道调用本机代码所必需的。
如果您需要在调用 runApp 之前初始化绑定,则只需调用此方法。
| 归档时间: |
|
| 查看次数: |
12228 次 |
| 最近记录: |