I am trying to map a DocumentSnap from Firebase to a Json Class in Flutter. I can confirm that my is getting the data from the document, but i cannot pass the gathered data to my Json object. I have attached code and error message.
Class for getting the document from Firebase DatabaseService.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:oast_app/widgets/auth_class.dart';
class FireTest {
Future<List<UserCheck>> streamUser(FirebaseUser user) async {
DocumentSnapshot querySnapshot =
await Firestore.instance.collection('users').document(user.uid).get();
if (querySnapshot.exists) {
print('success');
print(querySnapshot.data['fname']);
print(querySnapshot.data['lname']);
querySnapshot.data.map<String, dynamic>((json) => UserCheck.fromJson(json)); **this is whats erroring**
}
return [];
}
}
Json Object class
import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart';
part 'auth_class.g.dart';
@JsonSerializable(nullable: false)
class UserCheck extends ChangeNotifier {
final String uid;
final String fName;
final String lName;
final String regEmail;
final String org;
UserCheck({
this.uid,
this.fName,
this.lName,
this.regEmail,
this.org,
});
factory UserCheck.fromJson(Map<String, dynamic> json) =>
_$UserCheckFromJson(json);
Map<String, dynamic> toJson() => _$UserCheckToJson(this);
}
Error Message
Compiler message: lib/widgets/database_service.dart:17:76: Error: The argument type 'String' can't be assigned to the parameter type 'Map<String, dynamic>'.
firebase structure
^ collection('users').document('user.uid') this is the document im trying to get
Assuming that you have the collection name as "tblcustomers",
Stream<QuerySnapshot> stream = _db.collection("tblcustomers").snapshots();
jsonObject = Customers(error: false, errorCode: 0, Items: List<Customers_items>());
stream.forEach((QuerySnapshot element) {
if (element == null) return;
setState(() {
jsonObject.Items = element.documents.map((e) => Customers_items.fromJson(e.data)).toList();
});
});
Your target type that you set at the map has to be the type that you want as result of the map.
So it should be
querySnapshot.data.map((json) => UserCheck.fromJson(json)).toList();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FutureBuilder<DocumentSnapshot<Map<String, dynamic>>>(
future: FirebaseFirestore.instance
.collection('users')
.doc(FirebaseAuth.instance.currentUser!.uid) // 👈 Your document id change accordingly
.get(),
builder: (_, snapshot) {
if (snapshot.hasError) return Text('Error = ${snapshot.error}');
if (snapshot.connectionState == ConnectionState.waiting) {
return const Text("Loading");
}
UserCheck data = UserCheck.fromJson( snapshot.data!.data()!) // 👈 Here you have to use fromJson method
return Text(data.fName); //👈 Your data parameter here
},
)),
);
}
Also refer: How to use StreamBuilder
and FutureBuilder
for single and multiple documents `
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.