Hi I was trying to load a future data from firebase in init state using my model UserModel.fromJson(Map<String,dynamic> user)
but it keep throwing an error:
Null is not a sub type of Map<String, dynamic>
I know the future is not loaded right away but that case in future.builder can be handled but how can I do that for values this is my code:
@override
void initState() {
super.initState();
checkForAdmin();
print('settedBool:- $isAdmin');
}
Future<bool?> checkForAdmin() async {
var crud = Provider.of<CRUDModel>(context, listen: false);
var data = await crud.getUserById(id: widget.user!.uid);
setState(() {
isAdmin = data.isAdmin;
});
return data.isAdmin;
}
If anyone have any idea or suggestions please share. Thank you.
import 'package:cloud_firestore/cloud_firestore.dart';
class UserModel {
String? id;
String? displayName;
String? email;
String? phoneNumber;
String? photoUrl;
bool? isAdmin = false;
String? deviceToken;
UserModel({
this.id,
this.displayName,
this.email,
this.phoneNumber,
this.photoUrl,
this.isAdmin,
this.deviceToken,
});
UserModel.fromJson(Map<String?, dynamic>? data) {
id = data!['id'] ?? '';
displayName = data['displayName'] ?? '';
email = data['email'] ?? '';
phoneNumber = data['phoneNumber'] ?? '';
photoUrl = data['photoUrl'] ?? '';
isAdmin = data['isAdmin'] ?? false;
deviceToken = data['deviceToken'] ?? "";
}
UserModel.fromFirestore(DocumentSnapshot snapshot) {
Map doc = snapshot.data() as Map<dynamic, dynamic>;
id = doc['id'] ?? '';
displayName = doc['displayName'] ?? '';
email = doc['email'] ?? '';
phoneNumber = doc['phoneNumber'] ?? '';
photoUrl = doc['photoUrl'] ?? '';
isAdmin = doc['isAdmin'] ?? false;
deviceToken = doc['deviceToken'] ?? '';
}
UserModel.fromFirestoreQuerySnapshot(QuerySnapshot snapshot) {
snapshot.docs.map((doc) {
return {
id = doc['id'] ?? '',
displayName = doc['displayName'] ?? '',
email = doc['email'] ?? '',
phoneNumber = doc['phoneNumber'] ?? '',
photoUrl = doc['photoUrl'] ?? '',
isAdmin = doc['isAdmin'] ?? false,
deviceToken = doc['deviceToken'] ?? '',
};
});
}
Map<String, dynamic> toJson() {
return {
'id': id,
'displayName': displayName,
'email': email,
'phoneNumber': phoneNumber,
'photoUrl': photoUrl,
'isAdmin': isAdmin,
'deviceToken': deviceToken,
};
}
}
This is my model class and this is the crud call
Future<UserModel> getUserById({String? id}) async {
var doc = await _api!.getUserById(
id: id,
);
return UserModel.fromJson(doc.data() as Map<String, dynamic>);
}