Flutter: Unhandled Exception: ServicesBinding.defaultBinaryMessenger đã được truy cập trước khi khởi tạo ràng buộc


133

Bất kỳ giải pháp để giải quyết vấn đề này?

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

đặt dòng này làm câu lệnh đầu tiên của bạn trong main () - WidgetsFlutterBinding.ensureInitialized ();
Vijay Ram

Câu trả lời:


310

Sự cố này được đưa ra khi bạn nâng cấp Flutter. Lý do đằng sau điều này là bạn đang đợi một số dữ liệu hoặc chạy một asyncchức năng bên trong main().

Tôi đang khởi tạo ScopedModelbên trong main()và bên trong rằng tôi đang chờ một số dữ liệu.

Có một sửa chữa rất nhỏ. Chỉ cần chạy WidgetsFlutterBinding.ensureInitialized()vào bên trong void main(), trước khi bạn làm runApp(). Hoạt động như một sự quyến rũ !!

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

17
đảm bảo WidgetFlutterBinding.ensureInitialized () là dòng đầu tiên của main (). và sau đó tiến hành như thường lệ
Avnish kumar

10
Tác động tiêu cực tiềm ẩn của việc này là gì? Tất cả các ứng dụng Flagship có nên có dòng đó ở đầu main()phương thức không?
user482594

3
Nếu bạn đang sử dụng phương pháp async trong main (), bạn cần phải thêm này
Debasmita Sarkar

2
không hoạt động đối với ngắt v1.14.4 / v1.14.6 trên var databasesPath = await getDatabasesPath ();
Ares91

70

Điều này thường xảy ra nếu bạn đang chờ main()phương pháp. Vì vậy, giải pháp sẽ là:

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

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

1
không hoạt động - nghỉ khi tham gia (chờ getDatabasesPath (), 'mydb.db'),
live-love

25

Tôi không chắc liệu mình có câu trả lời chính xác hay không, nhưng tôi đã gặp phải lỗi tương tự sau một lần nâng cấp Flagship gần đây và đã cố gắng làm cho nó hoạt động, vì vậy tôi đang chia sẻ những phát hiện của mình.

Có vẻ như lỗi có thể do thay đổi vi phạm gần đây gây ra: https://groups.google.com/forum/#!msg/flutter-anosystem/sHAL2fBtJ1Y/mGjrKH3dEwAJ .

Do đó, chúng ta cần thay đổi mã theo cách thủ công như sau:

  • Nếu bạn đang chạy một ứng dụng và cần truy cập trình nhắn tin nhị phân trước đó runApp()đã được gọi (ví dụ: trong quá trình khởi tạo plugin), thì bạn cần phải gọi ứng dụng WidgetsFlutterBinding.ensureInitialized()đầu tiên một cách rõ ràng .
  • Nếu bạn đang chạy thử nghiệm, bạn có thể gọi TestWidgetsFlutterBinding.ensureInitialized()dòng đầu tiên trong main()phương thức của thử nghiệm để khởi tạo ràng buộc.

Ngoài ra, nếu bạn là một người mới như tôi và đang vật lộn để hiểu những điều trên và # 38464 , bạn có thể tạm thời tránh vấn đề này bằng cách chuyển sang kênh beta. Chỉ cần chạy "phiên bản beta kênh rung". Thay đổi vi phạm hiện chưa có trong kênh beta, vì vậy sau khi chuyển sang kênh beta, bạn sẽ không gặp phải lỗi này ít nhất là bây giờ.


Cảm ơn anh em, hiện tại mình mới dùng bản beta để tránh bị lỗi!
Sopheadavid Sopheap

11

chỉ cần thêm dòng này trong main.dart

WidgetsFlutterBinding.ensureInitialized(); 

mã của bạn có vẻ như

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

2

trong trường hợp của tôi khi sử dụng định hướng,

trước khi giải quyết:

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

sử dụng đã giải quyết:

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

Vấn đề là thêm WidgetsFlutterBinding.ensureInitialized () trong dòng đầu tiên của lớp chính


1

Trước khi tôi có phiên bản v1.12.13+hotfix.5, sau đó tôi chuyển sang phiên bản v1.14.4và nó hoạt động.

Lỗi nói rằng bạn nên thêm WidgetsFlutterBinding.ensureInitialized();, nhưng vì điều đó không hiệu quả với tôi nên tôi đã chuyển sang phiên bản khác. Một điều cần ghi nhớ là bạn vẫn phải thêm WidgetsFlutterBinding.ensureInitialized();vào dòng đầu tiên trong chính của bạn!


1

Giải pháp: Gọi WidgetsFlutterBinding.ensureInitialized(); trước khi gọi các hàm không đồng bộ.


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

1

Bạn có thể gặp phải điều này nếu bạn đang cố gắng thực thi mã gốc plugin một cách riêng biệt. Tài liệu isolate_handler ở đây giải thích rõ điều này:

Các plugin sử dụng một cơ chế được gọi là kênh nền tảng để giao tiếp giữa Dart và các bên gốc, một cơ chế truyền thông báo sử dụng kiểu MethodChannel. Cơ chế này phụ thuộc vào các yếu tố của công cụ giao diện người dùng cơ bản để hoạt động.

Điểm nổi bật ở đây là các phần tử cô lập sẽ chỉ tăng hiệu suất trong trường hợp mã phi tiêu tốn kém về mặt tính toán. Mã nền tảng của plugin sẽ sử dụng lại chuỗi chính (UI).

Việc gọi WidgetsFlutterBinding.ensureInitializedbên trong một vùng cách ly cũng sẽ không thành công do không có công cụ giao diện người dùng cơ bản trong vùng cách ly.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.