स्पंदन: अनहेल्दी अपवाद: ServicesBinding.defaultBinaryMessenger बाइंडिंग प्रारंभ होने से पहले एक्सेस किया गया था


134

इस समस्या के समाधान के लिए कोई उपाय?

स्टैक ट्रेस:

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

इस लाइन को अपने पहले स्टेटमेंट के रूप में मुख्य रूप से रखें () - WidgetsFlutterBinding.ensureInitialized ();
विजय राम

जवाबों:


312

यह समस्या तब पेश की जाती है जब आप फ़्लटर को अपग्रेड करते हैं। इसके पीछे का कारण है कि आप कुछ डेटा का इंतजार कर रहे हैं या कोई asyncफंक्शन चला रहे हैं main()

मैं ScopedModelअंदर-ही main()-भीतर शुरू कर रहा था कि मुझे कुछ आंकड़ों का इंतजार था।

बहुत छोटा फिक्स है। करने से पहले बस WidgetsFlutterBinding.ensureInitialized()अंदर दौड़ो । एक जादू की तरह काम करता है!!void main()runApp()

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

17
यह सुनिश्चित करें कि WidgetFlutterBinding.ensureInitialized () मुख्य की पहली पंक्ति है ()। और फिर हमेशा की तरह आगे बढ़ें
अवनीश कुमार

10
इसका संभावित नकारात्मक प्रभाव क्या है? क्या सभी स्पंदन अनुप्रयोगों में main()विधि की शुरुआत में वह रेखा होनी चाहिए ?
user482594

3
यदि आप मुख्य में async विधि का उपयोग कर रहे हैं (), तो आपको इसे जोड़ना होगा
Debasmita Sarkar

2
v1.14.4 / v1.14.6 के लिए var डेटाबेस पर काम नहीं कर रहा है ।Path = getDat डेटाबेसPath () का इंतजार करें;
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
काम नहीं कर रहा है - जुड़ने पर विराम लें (getDat डेटाबेसPath (), 'mydb.db' का इंतजार करें),
लाइव-लव

25

सुनिश्चित नहीं है कि मेरे पास सही उत्तर है, लेकिन मुझे हाल ही में हुए अपग्रेड के बाद एक ही त्रुटि मिली, और इसे काम करने में कामयाब रहा, इसलिए मैं अपने निष्कर्षों को साझा कर रहा हूं।

ऐसा लगता है कि त्रुटि हाल के ब्रेकिंग परिवर्तन के कारण हो सकती है: https://groups.google.com/forum/# .msg/flutter-announce/ sHAL2fBtJ1Y / mGjrKH3dEwAJ

परिणामस्वरूप, हमें कोड को मैन्युअल रूप से इस प्रकार बदलना होगा:

  • यदि आप किसी एप्लिकेशन को चला रहे हैं और बाइनरी मैसेंजर को एक्सेस करने की आवश्यकता है runApp(), तो WidgetsFlutterBinding.ensureInitialized()पहले कॉल किया गया है (उदाहरण के लिए, प्लगइन इनिशियलाइज़ेशन के दौरान), तो आपको पहले स्पष्ट रूप से कॉल करने की आवश्यकता है ।
  • यदि आप एक परीक्षण चला रहे हैं, तो आप बाध्यकारी को आरंभीकृत करने के लिए TestWidgetsFlutterBinding.ensureInitialized()अपने परीक्षण के main()तरीके में पहली पंक्ति के रूप में कह सकते हैं ।

वैकल्पिक रूप से, यदि आप मेरी तरह एक नौसिखिया हैं और ऊपर और # 38464 को समझने के लिए संघर्ष कर रहे हैं, तो आप अस्थायी रूप से बीटा चैनल पर स्विच करके इस समस्या से बच सकते हैं। बस "स्पंदन चैनल बीटा" चलाएं। ब्रेकिंग परिवर्तन बीटा चैनल में अभी तक नहीं है, इसलिए बीटा चैनल पर स्विच करने के बाद आपको कम से कम अभी के लिए यह त्रुटि नहीं मिलेगी।


धन्यवाद, भाई, अब मैंने त्रुटि से बचने के लिए बीटा संस्करण का उपयोग किया है!
सोफाएडविद सोपेप

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 () को जोड़ने के लिए बिंदु है


2

आप इस में भाग सकते हैं यदि आप एक अलग में प्लगइन देशी कोड को निष्पादित करने की कोशिश कर रहे हैं। Isolate_handler प्रलेखन यहाँ यह अच्छी तरह से बताते हैं:

प्लगिन डार्ट और देशी पक्षों के बीच संवाद करने के लिए प्लेटफ़ॉर्म चैनल नामक एक तंत्र का उपयोग करते हैं, मेथडकैनेल प्रकार का उपयोग करते हुए एक संदेश गुजरता तंत्र। यह तंत्र कार्य करने के लिए अंतर्निहित UI इंजन के तत्वों पर निर्भर करता है।

यहां पकड़ यह है कि आइसोलेट्स केवल कम्प्यूटेशनल रूप से महंगे डार्ट कोड के मामले में एक प्रदर्शन को बढ़ावा देगा। प्लगइन का प्लेटफ़ॉर्म कोड फिर से मुख्य (UI) थ्रेड का उपयोग करेगा।

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(
    ...
  )

0

GitHub के 47033 मुद्दे पर पोस्ट किए गए एक जवाब ने मेरी समस्या हल कर दी।

मुद्दा: https://github.com/flutter/flutter/issues/47033

मेरे लिए काम करने वाला समाधान: https://github.com/flutter/flutter/issues/47033#issuecomment-571936089

मुझे लगता है कि यह स्पंदन संस्करण 1.12.13 + हॉटफ़िक्स के संबंध में एक समस्या है शायद फ़्लटर को अपग्रेड करने से भी मदद मिल सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.