Search code examples
flutterfirebasedartgoogle-cloud-firestorecollections

logic for default address for many addresses for user in firebase flutter


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? :)


Solution

  • 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});
          }
        }); 
      }