Using Stream Building with a specific Firestore document

Each element should be casted to have a reference later in the code.

  return new StreamBuilder<DocumentSnapshot>(
      stream: Firestore.instance.collection('users').document(userId).snapshots(), //returns a Stream<DocumentSnapshot>
      builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
        if (!snapshot.hasData) {
          return new Text("Loading");
        }
        var userDocument = snapshot.data;
        return new Text(userDocument["name"]);
      }
  );
}

Lets say you want to create a Text with the name parameter from your document

Widget build(BuildContext context) {
  String userId = "skdjfkasjdkfja";
  return StreamBuilder(
      stream: Firestore.instance.collection('users').document(userId).snapshots(),
      builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
        if (!snapshot.hasData) {
          return Text("Loading");
        }
        var userDocument = snapshot.data;
        return Text(userDocument["name"]);
      }
  );
}

This is just one instance. Creating a StreamBuilder on the document will rebuild itself every time the document itself is changed. You can try this code, and then go to your console and change the "name" value. Your app will automatically reflect the changes.

Instead of just one Text, you could build entire tree that uses data from your stream.

If you want to get just at the moment value of the document, you can do so by resolving the Future of get() method on document reference.

var document = await Firestore.instance.collection('users').document(userId).get(),