In my case, I made collection for user addresses and in address model, made a parameter as Boolean "isDefault" to make one address as a default one
address model
class AddressModel {
final String addressId,
addressDetails,
country,
city,
phoneNumber,
phoneNumber2;
bool isDefault;
AddressModel(
{required this.addressId,
required this.addressDetails,
required this.country,
required this.city,
required this.phoneNumber,
required this.phoneNumber2,
this.isDefault = false});
factory AddressModel.fromJson(Map<String, dynamic> json) {
return AddressModel(
addressId: json["addressId"],
addressDetails: json["addressDetails"],
country: json["country"],
city: json["city"],
phoneNumber: json["phoneNumber"],
phoneNumber2: json["phoneNumber2"],
isDefault: json["isDefault"],
);
}
}
addressViewModel:
class AddressService extends ChangeNotifier {
List<AddressModel> _addressesList = [];
List<AddressModel> get addressesList => _addressesList;
AddressModel? _addressModel;
AddressModel? get defaultAddressModel => _addressModel;
get isLoading => _isloading;
bool _isloading = true;
void setLoading(bool val) {
_isloading = val;
notifyListeners();
}
final CollectionReference _addressCollection = FirebaseFirestore.instance
.collection("users")
.doc(FirebaseAuth.instance.currentUser!.phoneNumber ??
FirebaseAuth.instance.currentUser!.email)
.collection("addresses");
Future<void> getAddresses() async {
setLoading(true);
_addressesList = [];
await _addressCollection.get().then((QuerySnapshot querySnapshot) {
for (var doc in querySnapshot.docs) {
_addressesList
.add(AddressModel.fromJson(doc.data() as Map<String, dynamic>));
}
});
setLoading(false);
notifyListeners();
}
Future<void> getDefaultAddress() async {
await _addressCollection
.where("isDefault", isEqualTo: true)
.get()
.then((querySnapshot) {
for (var doc in querySnapshot.docs) {
_addressModel =
AddressModel.fromJson(doc.data() as Map<String, dynamic>);
}
});
notifyListeners();
}
}
I can't think with a logic code to create to handle default address for user, try to search with many solution to solve my problem, but I can't find any post explain anything like that,
I think using RadioTileList and that change the parameter of "isDefault" as true in one address and others as false, so I want anyone better than me to solve my problem, of suggest a new way to do that.
any ideas please? :)
I solve this problem and I want to share with you.
Future<void> changeDefaultAddress( AddressModel addressModel) async {
await _addressCollection
// .where("isDefault", isEqualTo: true)
.get()
.then((querySnapshot) {
for (var doc in querySnapshot.docs) {
if (doc["isDefault"] == true)
doc.reference.update({"isDefault": false});
_addressCollection
.doc(addressModel.addressId)
.update({"isDefault": true});
}
});
}