📜  在初始化绑定之前访问了 ServicesBinding.defaultBinaryMessenger. (1)

📅  最后修改于: 2023-12-03 14:51:24.546000             🧑  作者: Mango

关于在初始化绑定之前访问了 ServicesBinding.defaultBinaryMessenger

在Flutter开发过程中,如果您尝试在初始化绑定之前访问 ServicesBinding.defaultBinaryMessenger,将会遇到以下错误:

════════ Exception caught by widgets library ═════════════════════════════════════════════════════
'package:flutter/src/services/system_channels.dart': Failed assertion: line 72 pos 12: '_binding != null': is not true.

这是因为在初始化绑定之前,Flutter框架还没有完全初始化,而 ServicesBinding.defaultBinaryMessenger 需要依赖于 Binding 才能使用的属性。绑定被初始化时,BinaryMessenger 随之初始化,因此在此之前访问其 defaultBinaryMessenger 属性可能会导致崩溃。

为了解决这个问题,您需要在访问 defaultBinaryMessenger 之前等待绑定的初始化。您可以通过在 runApp() 之前插入一个 WidgetsFlutterBinding.ensureInitialized() 来实现这一点。

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // 等待绑定的初始化
  runApp(MyApp());
}

由于 ensureInitialized() 方法是一个异步操作,因此您也可以将其放在 await 语句中,以确保异步初始化完成:

void main() async {
  await WidgetsFlutterBinding.ensureInitialized(); // 等待绑定的初始化
  runApp(MyApp());
}

另外,您也可以在 MyApp 组件的 initState() 生命周期方法中等待初始化完成,以确保在访问 defaultBinaryMessenger 时已经完成了绑定的初始化。

class MyApp extends StatefulWidget {
  
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  
  void initState() {
    super.initState();
    WidgetsFlutterBinding.ensureInitialized(); // 等待绑定的初始化
  }

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MyApp',
      home: Scaffold(
        appBar: AppBar(
          title: Text('MyApp'),
        ),
        body: Center(
          child: Text('Hello World!'),
        ),
      ),
    );
  }
}

总之,请确保在访问 ServicesBinding.defaultBinaryMessenger 之前,先确保绑定的初始化已经完成,以避免程序崩溃。