Flutter: Unhandled Exception: ServicesBinding.defaultBinaryMessenger foi acessado antes da ligação ser inicializada


133

Alguma solução para resolver este problema?

Stacktrace:

[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<>

coloque esta linha como sua primeira instrução em main () - WidgetsFlutterBinding.ensureInitialized ();
Vijay Ram

Respostas:


311

Esse problema é apresentado quando você atualiza o Flutter. A razão por trás disso é que você está esperando por alguns dados ou executando uma asyncfunção interna main().

Eu estava inicializando por ScopedModeldentro main()e por dentro que estava aguardando alguns dados.

Existe uma solução muito pequena. Apenas corra para WidgetsFlutterBinding.ensureInitialized()dentro void main(), antes de fazer isso runApp(). Funciona como um encanto!!

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

17
certifique-se de que WidgetFlutterBinding.ensureInitialized () seja a primeira linha de main (). e prossiga normalmente
Avnish kumar

10
Qual é o potencial impacto negativo disso? Todas as aplicações de flutter devem ter essa linha no início do main()método?
user482594

3
Se você estiver usando o método assíncrono em main (), você precisa adicionar isto
Debasmita Sarkar

2
não está funcionando para v1.14.4 / v1.14.6 quebrar em var databasesPath = await getDatabasesPath ();
Ares91

70

Isso geralmente acontece se você estiver aguardando um main()método. Então, a solução seria:

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

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

1
não funciona - quebra na junção (aguarde getDatabasesPath (), 'mydb.db'),
live-love

25

Não tenho certeza se tenho a resposta correta, mas recebi o mesmo erro após uma atualização recente de flutter e consegui fazer funcionar, então estou compartilhando minhas descobertas.

Parece que o erro pode ser causado por uma alteração importante recente: https://groups.google.com/forum/#!msg/flutter-announce/sHAL2fBtJ1Y/mGjrKH3dEwAJ .

Como resultado, precisamos alterar manualmente o código da seguinte maneira:

  • Se você estiver executando um aplicativo e precisar acessar o mensageiro binário antes de runApp()ser chamado (por exemplo, durante a inicialização do plug-in), será necessário chamar explicitamente o WidgetsFlutterBinding.ensureInitialized()primeiro.
  • Se estiver executando um teste, você pode chamar o TestWidgetsFlutterBinding.ensureInitialized()como a primeira linha no main()método do seu teste para inicializar a vinculação.

Alternativamente, se você é um novato como eu e tem dificuldade para entender o que está acima e o # 38464 , pode evitar temporariamente esse problema mudando para o canal beta. Basta executar "flutter channel beta". A alteração significativa ainda não está no canal beta, então, depois de mudar para o canal beta, você não receberá esse erro, pelo menos por agora.


Obrigado mano, agora acabei de usar a versão beta para evitar erros!
Sopheadavid Sopheap

11

apenas adicione esta linha em main.dart

WidgetsFlutterBinding.ensureInitialized(); 

seu código parece

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

2

no meu caso, ao usar orientação,

antes resolvido:

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

uso resolvido:

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

O objetivo é adicionar WidgetsFlutterBinding.ensureInitialized () na primeira linha da classe principal


1

Antes de ter a versão v1.12.13+hotfix.5, mudei para a versão v1.14.4e funcionou.

O erro diz que você deve adicionar WidgetsFlutterBinding.ensureInitialized();, mas como isso não funcionou para mim, mudei para a outra versão. Uma coisa a ter em mente, porém, é que você ainda precisa adicionar WidgetsFlutterBinding.ensureInitialized();como a primeira linha em seu principal!


1

Solução: chame WidgetsFlutterBinding.ensureInitialized(); antes de chamar funções assíncronas.


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

1

Você pode se deparar com isso se estiver tentando executar o código nativo do plugin isoladamente. A documentação isolate_handler aqui explica isso bem:

Os plug-ins usam um mecanismo chamado canal de plataforma para se comunicar entre o Dart e os lados nativos, um mecanismo de passagem de mensagens usando o tipo MethodChannel. Esse mecanismo depende de elementos do mecanismo de UI subjacente para funcionar.

O problema aqui é que os isolados fornecerão um aumento de desempenho apenas no caso de código dardo computacionalmente caro. O código de plataforma do plug-in usará novamente o thread principal (UI).

Chamar WidgetsFlutterBinding.ensureInitializeddentro de um isolado também falhará devido à ausência de um mecanismo de IU subjacente no isolado.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.