firebase Flutter返回错误类型“列表< dynamic>”不是类型“字符串”的子类型

x4shl7ld  于 2023-01-14  发布在  Flutter
关注(0)|答案(2)|浏览(161)

我是flutter新手,我有一个名为diagnosis的字段,我试图从一个firestore文档中获取它,这个文档有时会有一个" "的值,或者一个[]有一个String的值,或者[]有多个String的值。但是很遗憾,我遇到了一个错误type 'List<dynamic>' is not a subtype of type 'String'。任何帮助都将不胜感激。谢谢。

云计算结果.dart

class CloudResults {
  final String examinationName;
  final String diagnosis;
  final String result;
  const CloudResults({
    required this.examinationName,
    this.diagnosis = '',
    required this.result,
  });
  Map<String, dynamic> toJson() {
    return {
      'examinationName': examinationName,
      'diagnosis': diagnosis,
      'result': result,
    };
  }
  CloudResults.fromSnapshot(
      QueryDocumentSnapshot<Map<String, dynamic>> snapshot)
      : documentId = snapshot.id,
        examinationName = snapshot.data()['examinationName'],
        diagnosis = snapshot.data()['diagnosis'],
        result = snapshot.data()['result'];
}

结果云存储.dart

class ResultsCloudStorage{
  final results = FirebaseFirestore.instance.collection('exam-results');
  Stream<Iterable<CloudResults>> allResults({required String patientId}) =>
      results.snapshots().map((event) => event.docs
          .map((doc) => CloudResults.fromSnapshot(doc))
          .where((result) => result.patientId == patientId));
}

检查记录屏幕.dart

class _ExamRecordScreenState extends State<ExamRecordScreen> {
  late final ResultsCloudStorage _resultsService;

  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
          stream: _resultsService.allResults(patientId: userId),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              final allResults = snapshot.data as Iterable<CloudResults>;
              return CustomScrollView(slivers: [
                SliverList(
                  ...
                )
              ]
              );
            } else {
              return const Center(
                child: CircularProgressIndicator(),
              );
            }
          }
        ),
    );
  }
}
vfhzx4xs

vfhzx4xs1#

您可以将diagnostics变量定义为List<String>,并在CloudResults.fromSnapshot中将diagnostics变量的赋值方法更改为:

diagnosis = snapshot.data()['diagnosis'] is String? [snapshot.data()['diagnosis']]:snapshot.data()['diagnosis'],
ylamdve6

ylamdve62#

我把诊断代码改成了这个。

class CloudResults {
  final List<String> diagnosis;
      const CloudResults({
        this.diagnosis = const [],

和云中的结果。来自快照

diagnosis = snapshot.data()['diagnosis'] is String
    ? [snapshot.data()['diagnosis'] as String]
    : (snapshot.data()['diagnosis'] as List<dynamic>)
    .map((e) => e as String)
    .toList(),

相关问题