在Flutter项目中同时使用Firebase与SharedPreferences时,是否需要两次调用WidgetsFlutterBinding.ensureInitialized()?
关于Flutter中多次调用WidgetsFlutterBinding.ensureInitialized()的疑问解答
你完全没必要调用两次WidgetsFlutterBinding.ensureInitialized(),只需要调用一次就足够了!
为什么不需要多次调用?
这个方法的核心作用是提前初始化Flutter与原生平台的绑定关系——毕竟你在runApp()之前就调用了Firebase.initializeApp()和SharedPreferences.getInstance()这类依赖原生能力的异步API,必须确保Flutter和原生层已经建立好连接,不然会抛出初始化相关的错误。
但关键是,ensureInitialized()是一个幂等方法:也就是说,第一次调用会完成初始化,后续再调用它不会做任何额外操作,只是返回已经初始化好的绑定实例。所以多次调用虽然不会导致bug,但完全是冗余的,既浪费代码行数,也没有任何实际意义。
优化后的代码示例
把两次调用合并成一次,放在所有异步操作的最前面就可以了:
void main() async { // 只需要调用这一次就够了 WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); SharedPreferences prefs = await SharedPreferences.getInstance(); // ... 你的其他初始化逻辑 runApp(MyApp()); }
额外补充
顺便提一句:在Flutter 1.12版本之后,runApp()本身会自动触发绑定初始化,但如果你在runApp()之前有需要异步执行的原生相关操作(比如你这里的Firebase和SharedPreferences初始化),就必须手动提前调用ensureInitialized(),否则会因为绑定未初始化而报错。这也是为什么你需要在开头加这一行的原因,但一次就足够啦。
内容的提问来源于stack exchange,提问作者user17647683
相关产品推荐
相关产品推荐

