Orion
Orion

Reputation: 11

Exception: Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist

The method mentioned in this thread https://stackoverflow.com/a/50867881/13153574 I am trying to fetch data from Firestore. But getting the following exception. The 'name' field is a String and 'overview' field is a List of Strings.

Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist

My code is as below:

import 'package:firebaseAuth/firebaseAuthDemo.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class FindDiseases extends StatefulWidget {
  final User user;

  const FindDiseases({Key key, this.user}) : super(key: key);
  @override
  _FindDiseasesState createState() => _FindDiseasesState();
}

class _FindDiseasesState extends State<FindDiseases> {
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  FirebaseAuth _auth = FirebaseAuth.instance;

  List diseasesList = [];
  //dynamic data;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.teal,
        automaticallyImplyLeading: false,
        title: Text(
          "Diseases List",
        ),
      ),
      key: _scaffoldKey,
      body: Center(
        child: FlatButton(
          color: Colors.white,
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Text("get Disease Record"),
              StreamBuilder<DiseaseRecord>(
                stream: getDisease(),
                builder: (BuildContext c, AsyncSnapshot<DiseaseRecord> data) {
                  if (data?.data == null) return Text("Error");

                  DiseaseRecord r = data.data;

                  return Text("${r.name}");
                },
              ),
            ],
          ),
          onPressed: () {
            getDisease();
          },
        ),
      ),
    );
  }

  Future _signOut() async {
    await _auth.signOut();
  }
}

Stream<DiseaseRecord> getDisease() {
  return FirebaseFirestore.instance.collection("diseases").doc().get().then(
    (snapshot) {
      try {
        return DiseaseRecord.fromSnapshot(snapshot);
      } catch (e) {
        print(">>> Error:"+e.toString());
        return null;
      }
    },
  ).asStream();
}

class DiseaseRecord {

  String name;
  List<String> overview = new List<String>();

  DiseaseRecord.fromSnapshot(DocumentSnapshot snapshot)
      : name = snapshot['name'],
        overview = List.from(snapshot['overview']);
}

Data is something like as below:

name: "name--"
overview: "['a', 'b', 'c']"

Upvotes: 0

Views: 99

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 598603

The problem is here:

return FirebaseFirestore.instance.collection("diseases").doc().get()

Calling doc() without any arguments creates a reference to a new, non-existing document. Then calling get() on that, returns a DocumentSnapshot for a non-existing document, and trying to get fields from that is an invalid operation.

Most likely you'll need to know the ID of the disease document you're trying to load, and pass that in to the call to doc(id).

Upvotes: 0

Related Questions