Flutter: Unhandled Exception: ServicesBinding.defaultBinaryMessenger був доступний до ініціалізації прив'язки


133

Будь-яке рішення для вирішення цієї проблеми?

Стек-трек:

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
If you're running an application and need to access the binary messenger before `runApp()` has been called (for example, during plugin initialization), then you need to explicitly call the `WidgetsFlutterBinding.ensureInitialized()` first.
If you're running a test, you can call the `TestWidgetsFlutterBinding.ensureInitialized()` as the first line in your test's `main()` method to initialize the binding.
#0      defaultBinaryMessenger.<anonymous closure> (package:flutter/src/services/binary_messenger.dart:73:7)
#1      defaultBinaryMessenger (package:flutter/src/services/binary_messenger.dart:86:4)
#2      MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:140:62)
#3      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:314:35)
<asynchronous suspension>
#4      MethodChannel.invokeMapMethod (package:f<>

покладіть цей рядок як перше твердження в main () - WidgetsFlutterBinding.ensureInitialized ();
Віджай Рам

Відповіді:


310

Ця проблема вводиться під час оновлення Flutter. Причиною цього є те, що ви чекаєте деяких даних або виконуєте asyncфункцію всередині main().

Я ініціалізував ScopedModelвсередині main()і всередині, що чекав деяких даних.

Є дуже невелике виправлення. Просто запустіть WidgetsFlutterBinding.ensureInitialized()всередину void main(), перш ніж зробити це runApp(). Працює як шарм !!

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(Delta(
    model: ProductDataModel(),
  ));
}

17
переконайтеся, що WidgetFlutterBinding.ensureInitialized () є першим рядком main (). а потім продовжуйте як завжди
Авніш кумар

10
Який потенційний негативний вплив на це? Чи повинні у всіх програмах трепетно ​​мати цей рядок на початку main()методу?
user482594

3
Якщо ви використовуєте метод async в main (), вам потрібно додати це
Debasmita Sarkar

2
не працює для перерви v1.14.4 / v1.14.6 на var databasesPath = чекати getDatabasesPath ();
Ares91

70

Зазвичай це відбувається, якщо ви чекаєте на main()метод. Отже, рішенням було б:

void main() {
  // add this, and it should be the first line in main method
  WidgetsFlutterBinding.ensureInitialized(); 

  // rest of your app code
  runApp(
    MaterialApp(...),
  );
}

1
не працює - перерви при з'єднанні (чекайте getDatabasesPath (), 'mydb.db'),
live-love

25

Не впевнений, чи маю я правильну відповідь, але я отримав таку ж помилку після недавнього оновлення, що летить, і мені вдалося змусити її працювати, тому я ділюсь своїми висновками.

Схоже, помилка може бути викликана нещодавньою зміною порушення: https://groups.google.com/forum/#!msg/flutter-announce/sHAL2fBtJ1Y/mGjrKH3dEwAJ .

Як результат, нам потрібно вручну змінити код наступним чином:

  • Якщо ви запускаєте програму і вам потрібно отримати доступ до бінарного месенджера до runApp()того, як було викликано (наприклад, під час ініціалізації плагіна), вам потрібно явно зателефонувати WidgetsFlutterBinding.ensureInitialized()першим.
  • Якщо ви виконуєте тест, ви можете викликати TestWidgetsFlutterBinding.ensureInitialized()рядок як перший рядок у main()методі вашого тесту, щоб ініціалізувати прив'язку.

Крім того, якщо ви такий новачок, як я, і намагаєтесь зрозуміти вищезазначене та # 38464 , ви можете тимчасово уникнути цієї проблеми, перейшовши на бета-канал. Просто запустіть "бета-верхівка каналу". Порушення зміни ще не в бета-каналі, тому після переходу на бета-канал ви не отримаєте цю помилку хоча б наразі.


Дякую, брате, зараз я просто використовував бета-версію, щоб уникнути помилок!
Sopheadavid Sopheap

11

просто додайте цей рядок у main.dart

WidgetsFlutterBinding.ensureInitialized(); 

здається, що ваш код

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  return runApp(MultiProvider(
    providers: [
      ChangeNotifierProvider.value(
        value: AppState(),
      )
    ],
    child: MyApp(),
  ));
}

2

у моєму випадку при використанні орієнтації,

до вирішення:

void main() {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_).{
runApp(MyApp());
});
}

вирішене використання:

void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
  .then((_) {
runApp(MyApp());
});
}

Справа в тому, щоб додати WidgetsFlutterBinding.ensureInitialized () у перший рядок основного класу


1

Перш ніж у мене була версія v1.12.13+hotfix.5, потім я перейшов на версію, v1.14.4і вона спрацювала.

Помилка говорить, що ви повинні додати WidgetsFlutterBinding.ensureInitialized();, але оскільки це не спрацювало для мене, я перейшов на іншу версію. Але слід пам’ятати, що вам потрібно додати WidgetsFlutterBinding.ensureInitialized();як перший рядок у своєму головному!


1

Рішення: Дзвінок WidgetsFlutterBinding.ensureInitialized(); перед викликом асинхронних функцій.


void main() async {
  WidgetsFlutterBinding.ensureInitialized();   //  ADD THIS BEFORE YOUR ASYNC FUNCTION CALL.
  await Firestore.instance.settings(...);      //  NOW YOU CAN CALL ASYNC FUNCTION.   
  ...
  runApp(
    ...
  )

1

Ви можете зіткнутися з цим, якщо намагаєтесь виконати нативний код плагіна в ізоляті. Документація isolate_handler тут добре пояснює:

Плагіни використовують механізм, який називається платформовим каналом для зв'язку між дартсом та нативною стороною, механізм передачі повідомлень за допомогою типу MethodChannel. Цей механізм залежить від елементів основного двигуна інтерфейсу, який повинен функціонувати.

Тут є те, що ізоляти забезпечують підвищення продуктивності лише у випадку обчислювально дорогого коду дартса. Код платформи плагіна знову використовуватиме основний потік (UI).

Виклик WidgetsFlutterBinding.ensureInitializedвсередині ізоляту також буде невдалим через відсутність базового двигуна інтерфейсу в ізоляті.


0

Відповідь, розміщена у випуску GitHub 47033, вирішила мою проблему.

випуск: https://github.com/flutter/flutter/isissue/47033

рішення, яке працювало для мене: https://github.com/flutter/flutter/isissue/47033#issuecomment-571936089

Я думаю, що це проблема стосовно флетера версії 1.12.13 + виправлення, можливо, також може допомогти погіршення флетера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.