इस त्रुटि को दिखाते हुए अशक्त-सुरक्षा में माइग्रेट करने के बाद। अब मुझे क्या करना चाहिए?

  Widget chatMessages() {
    return StreamBuilder(
        stream: messageStream,
        builder: (context, snapshot) {
          return snapshot.hasData
              ? ListView.builder(
                  padding: EdgeInsets.only(bottom: 70, top: 16),
                  itemCount: snapshot.data.docs.length,
                  reverse: true,
                  itemBuilder: (context, index) {
                    DocumentSnapshot ds = snapshot.data.docs[index];
                    return chatMessageTitle(
                        ds["message"], myUserName == ds["sendBy"]);
                  })
              : Center(child: CircularProgressIndicator());
        });
  }

इस त्रुटि को दिखाते हुए नल चेक (!) जोड़ने के बाद <गेटर 'डॉक्स' ऑब्जेक्ट के प्रकार के लिए परिभाषित नहीं है>

              itemCount: snapshot.data!.docs.length,
              reverse: true,
              itemBuilder: (context, index) {
                DocumentSnapshot ds = snapshot.data!.docs[index];
5
Azraf Al Monzim 17 मार्च 2021, 12:25

4 जवाब

सबसे बढ़िया उत्तर

आपको snapshot.data को उसके प्रकार में डालना है। मान लीजिए कि प्रकार QuerySnapshot है (इसे वास्तविक प्रकार के snapshot.data से बदलें)।

(snapshot.data! as QuerySnapshot).docs.length

सभी स्थानों पर टाइपकास्टिंग के बजाय, हम StreamBuilder में stream के प्रकार को निर्दिष्ट कर सकते हैं।

StreamBuilder<QuerySnapshot>(
  ...
);

अब snapshot.data का अनुमान QuerySnapshot के रूप में लगाया गया है और किसी टाइपकास्ट की आवश्यकता नहीं है।

snapshot.data!.docs.length
3
Navaneeth P 17 मार्च 2021, 12:56

कुछ समाधान हैं:

  • अपने StreamBuilder को एक प्रकार प्रदान करें:

    StreamBuilder<QuerySnapshot> (...)
    
  • अपने builder के दूसरे पैरामीटर के लिए एक प्रकार प्रदान करें:

    builder: (context, QuerySnapshot snapshot)
    
  • डाउनकास्ट करने के लिए as का उपयोग करें:

    (snapshot.data! as QuerySnapshot).docs['key']
    
1
CopsOnRoad 23 मई 2021, 12:25

मैंने StreamBuilder और बिल्डर (संदर्भ, AsyncSnapshot स्नैपशॉट) जोड़कर मेरा समाधान किया है।

 Widget chatMessages() {
     return StreamBuilder<QuerySnapshot>(
        stream: messageStream,
        builder: (context, AsyncSnapshot snapshot) {
       return snapshot.hasData
          ? ListView.builder(
              padding: EdgeInsets.only(bottom: 70, top: 16),
              itemCount: snapshot.data.docs.length,
              reverse: true,
              itemBuilder: (context, index) {
                DocumentSnapshot ds = snapshot.data.docs[index];
                return chatMessageTitle(
                    ds["message"], myUserName == ds["sendBy"]);
              })
          : Center(child: CircularProgressIndicator());
    });
 }
1
Alex Maina 7 जून 2021, 11:07

इस तरह त्रुटि और कनेक्शन स्थिति जाँचें जोड़ें:

      Widget chatMessages() {
        return StreamBuilder(
            stream: messageStream,
            builder: (context, snapshot) {
              if (snapshot.hasError) {
                return Text('Something went wrong');
                }
              if (snapshot.connectionState == ConnectionState.waiting) {
                return Text("Loading");
                }
              return ListView.builder(
                  padding: EdgeInsets.only(bottom: 70, top: 16),
                  itemCount: snapshot.data.docs.length,
                  reverse: true,
                  itemBuilder: (context, index) {
                    DocumentSnapshot ds = snapshot.data.docs[index];
                    return chatMessageTitle(
                    ds["message"], myUserName == ds["sendBy"]);
                    });
              });
        }
0
Simon Sot 17 मार्च 2021, 12:42