Flutter 从Firestore到地图的颤振/飞镖投射

Flutter 从Firestore到地图的颤振/飞镖投射,flutter,dart,google-cloud-firestore,Flutter,Dart,Google Cloud Firestore,我在将数据从firestore映射到模型时遇到问题。 我已经尝试了几个小时,但总是会出现强制转换错误异常,例如“Map不能强制转换为Map”或“type”\u InternalLinkedHashMap“不是“Map”类型的子类型 我尝试了以下链接中的示例: 还有更多的人仍然不明白这是怎么回事 这是我的实体和模型类: 实体 import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:equatable/equata

我在将数据从firestore映射到模型时遇到问题。 我已经尝试了几个小时,但总是会出现强制转换错误异常,例如“Map不能强制转换为Map”或“type”\u InternalLinkedHashMap“不是“Map”类型的子类型

我尝试了以下链接中的示例:

还有更多的人仍然不明白这是怎么回事

这是我的实体和模型类:

实体

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:equatable/equatable.dart';

class ScreenHomeEntity extends Equatable {
  final String id;
  final String userName;
  final String userEmail;
  final String mainDoor;
  final Map<dynamic, dynamic> doors;

  const ScreenHomeEntity(
      this.id, this.userName, this.userEmail, this.mainDoor, this.doors);

  @override
  List<Object> get props => [id, userName, userEmail, mainDoor, doors];

  @override
  String toString() =>
      'ScreenHomeEntity {id: $id, userName: $userName, userEmail: $userEmail, mainDoor: $mainDoor, doors: $doors}';

  Map<String, Object> toJson() {
    return {
      'id': id,
      'userName': userName,
      'userEmail': userEmail,
      'mainDoor': mainDoor,
      'doors': doors,
    };
  }

  static ScreenHomeEntity fromJson(Map<String, Object> json) {
    return ScreenHomeEntity(
      json['id'] as String,
      json['userName'] as String,
      json['userEmail'] as String,
      json['mainDoor'] as String,
      json['doors'] as Map<dynamic, dynamic>,
    );
  }

  Map<String, Object> toDocument() {
    return {
      'userName': userName,
      'userEmail': userEmail,
      'mainDoor': mainDoor,
      'doors': doors,
    };
  }

  static ScreenHomeEntity fromDocument(DocumentSnapshot doc) {
    return ScreenHomeEntity(
      doc.documentID,
      doc.data['userName'],
      doc.data['userEmail'],
      doc.data['mainDoor'],
      doc.data['doors'],
    );
  }
}
型号:

import 'package:brava_flutter/data/entities/screen_home_entity.dart';
import 'package:meta/meta.dart';

@immutable
class ScreenHome {
  final String id;
  final String userName;
  final String userEmail;
  final String mainDoor;
  final Map<String, ScreenHomeDoor> doors;

  ScreenHome(this.userName,
      {String userEmail = '',
      String id,
      String mainDoor,
      Map<String, ScreenHomeDoor> doors})
      : this.userEmail = userEmail ?? '',
        this.id = id,
        this.mainDoor = mainDoor ?? '',
        this.doors = doors ?? Map<String, ScreenHomeDoor>();

  ScreenHome copyWith({
    String id,
    String userName,
    String userEmail,
    String mainDoor,
    Map<String, ScreenHomeDoor> doors,
  }) {
    return ScreenHome(
      userName ?? this.userName,
      id: id ?? this.id,
      userEmail: userEmail ?? this.userEmail,
      mainDoor: mainDoor ?? this.mainDoor,
      doors: doors ?? this.doors,
    );
  }

  @override
  int get hashCode =>
      id.hashCode ^
      userName.hashCode ^
      userEmail.hashCode ^
      mainDoor.hashCode ^
      doors.hashCode;

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is ScreenHome &&
          runtimeType == other.runtimeType &&
          id == other.id &&
          userName == other.userName &&
          userEmail == other.userEmail &&
          mainDoor == other.mainDoor &&
          doors == other.doors;

  @override
  String toString() =>
      'ScreenHomeModel {id: $id, userName: $userName, userEmail: $userEmail, mainDoor: $mainDoor, doors: $doors}';

  ScreenHomeEntity toEntity() =>
      ScreenHomeEntity(id, userName, userEmail, mainDoor, doors);

  static ScreenHome fromEntity(ScreenHomeEntity entity) {
    return ScreenHome(
      entity.userName,
      id: entity.id,
      userEmail: entity.userEmail,
      mainDoor: entity.mainDoor,
      doors: entity.doors, // EXCEPTION
    );
  }
}

class ScreenHomeDoor {
  String name;
  String address;

  ScreenHomeDoor.fromMap(Map<dynamic, dynamic> data)
      : name = data['name'],
        address = data['address'];
}
firestore数据示例: 回答:

在模型中,方法“fromEntity”我并没有将实体映射动力学强制转换为模型映射对象,而模型映射对象正是发生异常的地方。 这个动态地图中的每一个值都应该被转换成object,而我一直在做错事

  static ScreenHome fromEntity(ScreenHomeEntity entity) {
    return ScreenHome(
      entity.userName,
      id: entity.id,
      userEmail: entity.userEmail,
      mainDoor: entity.mainDoor,
      doors: entity.doors
          .map((k, v) => MapEntry(k as String, ScreenHomeDoor.fromMap(v))),
    );
  }
在整个过程中,我一直试图使用MapEntryk作为字符串,v作为ScreenHomeDoor.fromMapv

一个简单而愚蠢的错误……

回答:

在模型中,方法“fromEntity”我并没有将实体映射动力学强制转换为模型映射对象,而模型映射对象正是发生异常的地方。 这个动态地图中的每一个值都应该被转换成object,而我一直在做错事

  static ScreenHome fromEntity(ScreenHomeEntity entity) {
    return ScreenHome(
      entity.userName,
      id: entity.id,
      userEmail: entity.userEmail,
      mainDoor: entity.mainDoor,
      doors: entity.doors
          .map((k, v) => MapEntry(k as String, ScreenHomeDoor.fromMap(v))),
    );
  }
在整个过程中,我一直试图使用MapEntryk作为字符串,v作为ScreenHomeDoor.fromMapv


一个简单而愚蠢的错误……

您错过了一些代码,但我看到可能存在类型不兼容的错误。难道你没有忘记使用ScreenHomeDoor.FromMap数据方法吗?能否从firebase控制台显示Firestore对象结构?如果我了解如何将地图从firestore数据结构转换为MapI添加图片,我可以帮助您。我没有忘记调用。fromMap ScreenHomeDoor,我用模型类中的“fromEntity”调用它,这就是我得到错误的地方。您错过了一些代码,但我看到了类型不兼容的可能错误。难道你没有忘记使用ScreenHomeDoor.FromMap数据方法吗?能否从firebase控制台显示Firestore对象结构?如果我了解如何将地图从firestore数据结构转换为MapI添加图片,我可以帮助您。我没有忘记调用。fromMap ScreenHomeDoor,我在模型类中用'fromEntity'调用它,这就是我得到错误的地方。