为何仅少数Flutter插件需调用WidgetsFlutterBinding.ensureInitialized()?
核心原因在于插件调用时机和Flutter绑定初始化的时机:
首先明确
WidgetsFlutterBinding.ensureInitialized()的作用:它会提前初始化Flutter的核心绑定机制,包括平台通道(Method Channel)的初始化——这是Flutter和原生平台通信的基础。对于sqflite来说,很多开发者会在
main()函数里、runApp()之前就执行数据库初始化操作(比如打开数据库)。这时候Flutter还没自动完成绑定初始化,平台通道还不可用,所以必须手动调用WidgetsFlutterBinding.ensureInitialized()来确保通信通道正常工作。如果是在runApp()之后(比如在Widget的initState里)再初始化sqflite,其实也不需要手动调用这个方法。而shared_preferences、device_info_plus、xmpp_plugin这类插件,大多数场景下都是在
runApp()之后才被首次调用(比如在页面Widget的生命周期里初始化)。此时Flutter已经自动完成了WidgetsFlutterBinding的初始化,平台通道已经就绪,所以不需要额外手动调用WidgetsFlutterBinding.ensureInitialized()。
额外补充:如果把这些“不需要”的插件也放在runApp()之前调用,同样会触发平台通道未初始化的错误,这时候也必须先调用WidgetsFlutterBinding.ensureInitialized()才行。
内容的提问来源于stack exchange,提问作者Kaustubh Dixit

