' 不是类型 'Ad1' 的子类型,flutter,dart"/>

首页 > 解决方案 > 错误:输入'_InternalLinkedHashMap' 不是类型 'Ad1' 的子类型

问题描述

我无法处理"type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Ad1'. 我会很感激你的帮助,拜托。

我正在使用 Firestore,我的数据是这样的:

  {
    "name": "toto@ttt.fr",
    "nom": "ducat",
    "prenom": "raoul",
    "profilcomplete": 0,
    "compteur": 0,
    "cercle": 10,
    "ad1": {
        "adresse": "gnagna",
        "cp": "75013",
        "ville": "paris",
        "position":[82.3,2.37]
    }
}

我的模型类(AppUserData.dart)是:

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

AppUserData appUserDataFromMap(String str) =>
    AppUserData.fromMap(json.decode(str));

String appUserDataToMap(AppUserData data) => json.encode(data.toMap());
class AppUserData {
  AppUserData({
    required this.uid,
    required this.name,
    required this.nom,
    required this.prenom,
    required this.profilcomplete,
    required this.compteur,
    required this.cercle,
    required this.ad1,
  });

  String uid;
  String name;
  String nom;
  String prenom;
  bool profilcomplete;
  int compteur;
  int cercle;
  Ad1 ad1;

  factory AppUserData.fromMap(Map<String, dynamic> json) => AppUserData(
        uid: json["uid"],
        name: json["name"],
        nom: json["nom"],
        prenom: json["prenom"],
        profilcomplete: json["profilcomplete"],
        compteur: json["compteur"],
        cercle: json["cercle"],
        ad1: Ad1.fromMap(json["ad1"]),
      );

  Map<String, dynamic> toMap() => {
        "name": name,
        "nom": nom,
        "prenom": prenom,
        "profilcomplete": profilcomplete,
        "compteur": compteur,
        "cercle": cercle,
        "ad1": ad1.toMap(),
      };
}

class Ad1 {
  Ad1({
    required this.adresse,
    required this.cp,
    required this.ville,
    required this.position,
  });

  String adresse;
  String cp;
  String ville;
  GeoPoint position;

  factory Ad1.fromMap(Map<String, dynamic> json) => Ad1(
        adresse: json["adresse"],
        cp: json["cp"],
        ville: json["ville"],
        position: json["position"],
      );

  Map<String, dynamic> toMap() => {
        "adresse": adresse,
        "cp": cp,
        "ville": ville,
        "position": position,
      };
}

我正在使用一个名为 database.dart 的文件来访问和编写 [EDIT WITH SOLUTION]:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:ttt/models/user.dart';

class DatabaseService {
  final String uid;

  DatabaseService(this.uid);

  final CollectionReference<Map<String, dynamic>> userCollection =
      FirebaseFirestore.instance.collection("users");
  AppUserData _userFromSnapshot(
      DocumentSnapshot<Map<String, dynamic>> snapshot) {
    var data = snapshot.data();
    if (data == null) throw Exception("Utilisateur non trouvé");
    print(snapshot.id);
    return AppUserData(
      uid: snapshot.id,
      name: data['name'],
      nom: data['nom'],
      prenom: data['prenom'],
      compteur: data['compteur'],
      profilcomplete: data['profilcomplete'],
      // ad1: data['ad1'],  <-- doesn't work
      ad1: Ad1.fromMap(data["ad1"]), // <-- Solution (Thanks daddygames)
      cercle: data['cercle'],
    );
  }

Stream<AppUserData> get user {
    return userCollection.doc(uid).snapshots().map(_userFromSnapshot);
  }

List<AppUserData> _userListFromSnapshot(
      QuerySnapshot<Map<String, dynamic>> snapshot) {
    return snapshot.docs.map((doc) {
      return _userFromSnapshot(doc);
    }).toList();
  }

 Stream<List<AppUserData>> get users {
    return FirebaseFirestore.instance
        .collection('users')
        .orderBy('ad1.position')
        .snapshots()
        .map(_userListFromSnapshot);
  }
}

当我想使用 显示列表时StreamProvider<List<AppUserData>>,出现此错误:

type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Ad1'

我错过了什么或做错了什么?谢谢

标签: flutterdart

解决方案


当你实例化你的AppUserData对象时。您正在分配data['ad1']给您的ad1财产。您应该使用Ad1.fromMap(data["ad1"])AppUserData.fromMap(data)


推荐阅读