繁体   English   中英

Flutter 返回错误类型 'List<dynamic> ' 不是类型 'String' 的子类型</dynamic>

[英]Flutter returning error type 'List<dynamic>' is not a subtype of type 'String'

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

cloud_results.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'];
}

结果_cloud_storage.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));
}

exam_record_screen.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(),
              );
            }
          }
        ),
    );
  }
}

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

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

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

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

在 CloudResults.fromSnapshot 中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM