【发布时间】:2020-08-24 09:54:35
【问题描述】:
我们何时以及如何使用它? 它是如何工作的?
【问题讨论】:
标签: flutter
我们何时以及如何使用它? 它是如何工作的?
【问题讨论】:
标签: flutter
你必须以这种方式使用它:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
https://flutter.dev/docs/resources/architectural-overview#architectural-layers
WidgetFlutterBinding 用于与 Flutter 引擎交互。 Firebase.initializeApp() 需要调用原生代码来初始化 Firebase,并且由于插件需要使用平台通道来调用原生代码,这是异步完成的,因此您必须调用 ensureInitialized() 以确保您有一个实例WidgetsBinding。
【讨论】:
WidgetsBinding.ensureInitialized() Dart Layer 和 Flutter Engine 之间的初始化通信。
如果我们需要在调用 [runApp] 之前初始化绑定,我们需要调用此方法。在绑定建立之前,Flutter 不能直接与 Flutter 引擎交互。
示例 1: 展示了 Flutter 和本机代码之间的 Firebase 平台初始化,Firestore 类在内部进行。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firestore.initializeApp();
runApp(
...
)
}
或
示例 2: 在应用启动之前显示设备方向变化,为此我们还需要建立绑定连接。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown
]);
runApp(
...
)
}
在内部,WidgetsBinding.ensureInitialized() 支持各种绑定,如GestureBinding、SchedulerBinding、ServicesBinding、PaintingBinding、SemanticsBinding、RendererBinding、WidgetsBinding
ServicesBinding 侦听平台消息并将它们定向到传入消息的处理程序 (BinaryMessenger)。
PaintingBinding负责绑定画库。
RenderBinding 将渲染树绑定到 Flutter 引擎。
WidgetBinding 将小部件树绑定到 Flutter 引擎。
SchedulerBinding 是运行即时任务的调度程序。
SemanticsBinding绑定语义层和Flutter引擎。
GestureBinding 是手势子系统的绑定。
【讨论】: