Плохое состояние: поле не существует в ошибке флаттера DocumentSnapshotPlatform, хотя поле существует

Это моя база данных, и для одного документа мой код поиска работает, но для всех остальных документов я получаю сообщение об ошибке Плохое состояние: поле не существует в DocumentSnapshotPlatform.

Вот код. Строящийся виджет пока просто показывает значения в поле «температура» документа для выбранного документа (с использованием docid). Я не понимаю, как это работает для одного документа, но не для других.

widget. который представляет собой просто строку «температура». Я использовал его, потому что я также делал это для пульса, но пока у меня только датчик температуры.

import 'package:flutter/material.dart'
import 'package:cloud_firestore/cloud_firestore.dart'
import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart'
import 'package:geolocator/geolocator.dart'
import 'package:sms_maintained/contact.dart'
import 'package:sms_maintained/generated/i18n.dart'
import 'package:sms_maintained/globals.dart'
import 'package:sms_maintained/sms.dart'

CollectionReference main = FirebaseFirestore.instance.collection('maindb');
SmsMessage message;

class biom extends StatefulWidget {
  biom({this.which, this.image, this.docid});
  final String which;
  final String docid;
  final String image;

  @override
  _biomState createState() => _biomState();
}

_callNumber(phoneno) async {
  print('in calling function');
  bool res = await FlutterPhoneDirectCaller.callNumber(phoneno.toString());
}

sendMessage(phoneno, curLat, curLong, flag) async {
  print('in sendmessage func');
  Position position = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high);
  curLat = position.latitude;
  curLong = position.longitude;
  //flag==0 is temp exceeds
  //flag==1 is distance outside
  SmsSender sender = SmsSender();
  String address = phoneno.toString();
  if (flag == 1) {
    print('in flag 1');
    message = SmsMessage(
        address, 'PATIENT HAS WANDERED: LOCATION IS $curLat ,$curLong ');
  } else {
    print('in flag 0');
    message = SmsMessage(address,
        'PATIENTS TEMPERATURE IS AT DANGEROUS LEVEL. PROVIDE AMBULANCE TO $curLat ,$curLong');
  }

  message.onStateChanged.listen((state) {
    if (state == SmsMessageState.Sent) {
      print("SMS is sent!");
    } else if (state == SmsMessageState.Delivered) {
      print("SMS is delivered!");
    }
  });
  sender.sendSms(message);
}

distanceCalc(double lat, double long, int radius, phoneno) async {
  print('in function with $lat, $long');
  Position position = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high);
  double curLat = position.latitude;
  double curLong = position.longitude;
  print(
      'current lat is ${position.latitude},current long is ${position.longitude}');
  double distanceInMeters =
      await Geolocator.distanceBetween(lat, long, curLat, curLong);
  print('distance is $distanceInMeters meters');
  if (distanceInMeters > radius) {
    print('distance exceeds radius');
    sendMessage(phoneno, curLat, curLong, 1);
    _callNumber(phoneno);
  }
}

class _biomState extends State<biom> {
  @override
  Widget build(BuildContext context) {
    print('docid is ${widget.docid}');
    return Expanded(
      child: Container(
        height: 80.0,
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            Image.asset('images/${widget.image}.png',
                height: 100.0, width: 100.0),
            StreamBuilder(
                stream: FirebaseFirestore.instance
                    .collection('maindb')
                    .doc(widget.docid)
                    .snapshots(),
                builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                  if (!snapshot.hasData) {
                    return Text("Loading");
                  }
                  var userDocument = snapshot.data;
                  var phoneno = userDocument['phone'];
                  int radius = userDocument['radius'];
                  distanceCalc(userDocument['latitude'],
                      userDocument['longitude'], radius, phoneno);
                  if (userDocument['temperature'] > 29) {
                    print('temp is userDocument["${widget.which}"]');
                    sendMessage(phoneno, 0, 0, 0);
                    // _callNumber(phoneno);
                    print(
                        'calling because ${userDocument["${widget.which}"]} is greater than 31');
                  }
                  return CircleWidget(num: userDocument['temperature']);
                })
          ],
        ),
      ),
    );
  }
}

class CircleWidget extends StatelessWidget {
  final int num;
  CircleWidget({this.num});
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 150.0,
      width: 200.0,
      padding: const EdgeInsets.symmetric(),
      decoration: BoxDecoration(
          color: Colors.black12,
          borderRadius: BorderRadius.only(
              topRight: Radius.circular(40.0),
              bottomRight: Radius.circular(40.0),
              topLeft: Radius.circular(40.0),
              bottomLeft: Radius.circular(40.0))),
      child: Center(
        child:
            Text(num.toString(), style: Theme.of(context).textTheme.headline5),
      ),
    );
  }
}

Вот документ и экран, для которых работает код. works enter image description here

Вот один документ, который не работает, и экран. no work

no

ОТВЕТ ************ заменил snapshot.data на snapshot.data.data ()

Всего 1 ответ


snapshot.data должен быть snapshot.data.docs, а затем перебрать их и получить что-то вроде let Map<String, dynamic> doc = snapshot.data.docs[i].data().

Примечание: измените свое соглашение об именах. Имя класса в верхнем регистре, верблюжий регистр для переменных и т. Д.

Изменить: попробуйте поиграть с snapshot.data.data ()


Есть идеи?

10000