Flutter : 처리되지 않은 예외 : 바인딩이 초기화되기 전에 ServicesBinding.defaultBinaryMessenger에 액세스했습니다.


133

이 문제를 해결할 해결책이 있습니까?

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

이 줄을 main ()에 첫 번째 문장으로 넣으십시오.-WidgetsFlutterBinding.ensureInitialized ();
Vijay Ram

답변:


310

이 문제는 Flutter를 업그레이드 할 때 발생합니다. 그 이유는 일부 데이터를 기다리거나 async내부 에서 함수를 실행하고 있기 때문 main()입니다.

나는 ScopedModel내부 main()와 내부에서 일부 데이터를 기다리고 있다고 초기화했습니다 .

아주 작은 수정이 있습니다. 당신이하기 전에 그냥 WidgetsFlutterBinding.ensureInitialized()안으로 뛰어 들어라 . 매력처럼 작동 !!void main()runApp()

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

17
WidgetFlutterBinding.ensureInitialized ()가 main ()의 첫 번째 줄인지 확인하십시오. 그런 다음 평소대로 진행합니다
Avnish kumar

10
이것의 잠재적 인 부정적인 영향은 무엇입니까? 모든 flutter 응용 프로그램은 main()메서드 시작 부분에 해당 줄이 있어야합니까 ?
user482594

3
당신이) (주에서 비동기 방식을 사용하는 경우이 추가 할 필요가
Debasmita 사카

2
v1.14.4 / v1.14.6에서 작동하지 않음 var databasesPath = await 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
작동하지 않음-join에서 중단 (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 유형을 사용하는 메시지 전달 메커니즘 인 Dart와 네이티브 측간에 통신하기 위해 플랫폼 채널이라는 메커니즘을 사용합니다. 이 메커니즘은 기본 UI 엔진의 요소에 따라 작동합니다.

여기서 문제는 분리가 계산 비용이 많이 드는 다트 코드의 경우에만 성능 향상을 제공한다는 것입니다. 플러그인의 플랫폼 코드는 다시 main (UI) 스레드를 사용합니다.

WidgetsFlutterBinding.ensureInitialized격리에 기본 UI 엔진이 없기 때문에 격리 내부 호출 도 실패합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.