The property 'docs' cannot be unconditionally accessed because received can be 'null' Flutter
5,603
Solution 1
You have to cast snapshot.data
to its type. Suppose the type is QuerySnapshot
(change this with the actual type of snapshot.data
).
(snapshot.data! as QuerySnapshot).docs.length
Instead of typecasting at all locations, we can specify the type of stream
in the StreamBuilder
.
StreamBuilder<QuerySnapshot>(
...
);
Now snapshot.data
is inferred as QuerySnapshot
and no typecast is required.
snapshot.data!.docs.length
Solution 2
I have solved mine by adding StreamBuilder and builder(context, AsyncSnapshot snapshot).
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());
});
}
Solution 3
There are a few solutions:
Provide a type to your
StreamBuilder
:StreamBuilder<QuerySnapshot> (...)
Provide a type to the second parameter of your
builder
:builder: (context, QuerySnapshot snapshot)
Use
as
to downcast:(snapshot.data! as QuerySnapshot).docs['key']
Solution 4
Add error and connection state checks like this:
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"]);
});
});
}
![monzim](https://i.stack.imgur.com/RBLrl.jpg?s=256&g=1)
Author by
monzim
Updated on December 28, 2022Comments
-
monzim over 1 year
After migrate to null-safety showing this error. What should I do now?
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()); }); }
After adding null check (!) showing this error <the getter 'docs' is not defined for the type of object>
itemCount: snapshot.data!.docs.length, reverse: true, itemBuilder: (context, index) { DocumentSnapshot ds = snapshot.data!.docs[index];