flutter - 错误:输入'_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'
我错过了什么或做错了什么?谢谢
解决方案
当你实例化你的AppUserData
对象时。您正在分配data['ad1']
给您的ad1
财产。您应该使用Ad1.fromMap(data["ad1"])
或AppUserData.fromMap(data)
推荐阅读
- javascript - 使用 jquery 获取可见而不是隐藏的项目
- ios - 从“ViewController”到“AVCaptureMetadataOutputObjectsDelegate”的条件转换总是成功
- python - 如何从弹出窗口向 boxlayout 添加新标签?
- php - 没有 odata nextlink 与 microsoft graph drive children
- sql-server - 如何根据今天的日期和时间获取数据?
- pandas - Pandas, astype(int) 应用于浮点列返回负数
- c++ - 使用 std::set 的 .begin() 和 .end() 函数会产生意想不到的结果
- javascript - 使用 Web 组件而不注册为自定义元素?
- angular - 如何在 sharedModule 中使用 DatePickerComponent
- r - r传单弹出窗口没有显示任何内容