769 lines
20 KiB
Dart
769 lines
20 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:fluttertoast/fluttertoast.dart';
|
|
import 'package:geolocator/geolocator.dart';
|
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
|
import 'package:grocery_app/src/core/network_services/service_locator.dart';
|
|
import 'package:grocery_app/src/core/routes/routes.dart';
|
|
import 'package:grocery_app/src/data/allProduct_model.dart';
|
|
import 'package:grocery_app/src/data/all_cart_items.dart';
|
|
import 'package:grocery_app/src/data/banners.dart';
|
|
import 'package:grocery_app/src/data/best_dealProduct.dart';
|
|
import 'package:grocery_app/src/data/product_category.dart';
|
|
import 'package:grocery_app/src/data/product_details.dart';
|
|
import 'package:grocery_app/src/data/wish_list_model.dart';
|
|
import 'package:grocery_app/src/logic/repo/product_repo.dart';
|
|
import 'package:grocery_app/utils/constants/shared_pref_utils.dart';
|
|
import 'package:grocery_app/utils/extensions/extensions.dart';
|
|
|
|
import 'package:http/http.dart' as http;
|
|
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
class ProductProvider extends ChangeNotifier {
|
|
final _homeRepo = getIt<ProductRepo>();
|
|
|
|
String searchValue = '';
|
|
|
|
bool isLoadingg = false;
|
|
|
|
List<Product> products = [];
|
|
|
|
int page = 1;
|
|
final int limit = 8;
|
|
|
|
bool hasMore = true;
|
|
|
|
bool iscroll = true;
|
|
|
|
Future<void> gettAllProduct(
|
|
BuildContext context, String id, bool status, String search) async {
|
|
if (isLoadingg || !hasMore) return;
|
|
print("kjldfgjklfjkdgjkhlfg");
|
|
if (id.isNotEmpty) {
|
|
products.clear();
|
|
|
|
hasMore = true;
|
|
}
|
|
|
|
if (status) {
|
|
isLoadingg = true;
|
|
}
|
|
;
|
|
|
|
notifyListeners();
|
|
var data = {
|
|
"page": page,
|
|
"limit": limit,
|
|
"minPrice": "",
|
|
"minPrice": "",
|
|
"search": search
|
|
};
|
|
var result = await _homeRepo.getAllProduct(data, context, id);
|
|
return result.fold(
|
|
(error) {
|
|
isLoadingg = false;
|
|
notifyListeners();
|
|
},
|
|
(response) {
|
|
// products = response.data!;
|
|
// page++;
|
|
// print(
|
|
// "jksdhfgkjdfkhjghkjdfhgkjdf ${response.data} ${response.data!.isNotEmpty}");
|
|
// if (response.data != null && response.data!.isNotEmpty) {
|
|
// products.addAll(response.data!);
|
|
// // products = response.data!;
|
|
// page++;
|
|
// } else {
|
|
// hasMore = false;
|
|
// }
|
|
|
|
if (response.data != null && response.data!.isNotEmpty) {
|
|
if (id.isNotEmpty) {
|
|
products = response.data!;
|
|
} else {
|
|
products.addAll(response.data!);
|
|
}
|
|
page++;
|
|
|
|
if (response.data!.length < limit) {
|
|
hasMore = false;
|
|
}
|
|
} else {
|
|
hasMore = false;
|
|
}
|
|
|
|
isLoadingg = false;
|
|
notifyListeners();
|
|
},
|
|
);
|
|
}
|
|
|
|
bool isHomeLoadingg = false;
|
|
|
|
List<Product> homeproducts = [];
|
|
|
|
Future<void> getHomeProduct(BuildContext context, String id, String search,
|
|
String minPrice, String maxprice, orderby) async {
|
|
isHomeLoadingg = true;
|
|
|
|
notifyListeners();
|
|
var data = {
|
|
"minPrice": "${minPrice}",
|
|
"minPrice": "${maxprice}",
|
|
"search": search,
|
|
"sortBy": orderby
|
|
};
|
|
var result = await _homeRepo.getAllProduct(data, context, id);
|
|
return result.fold(
|
|
(error) {
|
|
isLoadingg = false;
|
|
notifyListeners();
|
|
},
|
|
(response) {
|
|
homeproducts = response.data!;
|
|
|
|
isHomeLoadingg = false;
|
|
notifyListeners();
|
|
},
|
|
);
|
|
}
|
|
|
|
ProductDetailsData productDetails = ProductDetailsData();
|
|
bool isProductLoading = true;
|
|
|
|
Future<void> getProduuctDetails(
|
|
BuildContext context, String id, int quantity, String price) async {
|
|
var data = {};
|
|
productDetails = ProductDetailsData();
|
|
isProductLoading = true;
|
|
quantitys = quantity;
|
|
_totalPrice = quantity * (double.parse(price));
|
|
notifyListeners();
|
|
|
|
var result = await _homeRepo.getProductDetails(data, context, id);
|
|
return result.fold(
|
|
(error) {
|
|
isProductLoading = false;
|
|
notifyListeners();
|
|
},
|
|
(response) {
|
|
productDetails = response!;
|
|
isProductLoading = false;
|
|
notifyListeners();
|
|
},
|
|
);
|
|
}
|
|
|
|
List<BestDeal> bestdeal = [];
|
|
|
|
bool isBestdealingloading = true;
|
|
|
|
Future<void> getBestDealProduct(BuildContext context, String search) async {
|
|
isBestdealingloading = true;
|
|
notifyListeners();
|
|
var data = {"minPrice": "", "minPrice": "", "search": search};
|
|
var result = await _homeRepo.getBestDealProduct(data, context);
|
|
return result.fold(
|
|
(error) {
|
|
isBestdealingloading = false;
|
|
notifyListeners();
|
|
},
|
|
(response) {
|
|
bestdeal = response.data!;
|
|
isBestdealingloading = false;
|
|
notifyListeners();
|
|
},
|
|
);
|
|
}
|
|
|
|
List<Datum> categoryList = [];
|
|
|
|
bool iscategroyloading = true;
|
|
Future<void> getAllcategory(BuildContext context) async {
|
|
var data = {};
|
|
|
|
var result = await _homeRepo.getAllcategory(data, context);
|
|
return result.fold(
|
|
(error) {
|
|
print("djhgfjdfhjg ${error}");
|
|
iscategroyloading = false;
|
|
notifyListeners();
|
|
},
|
|
(response) {
|
|
print("jdshfjghdhfjhgjd");
|
|
categoryList = response.data!;
|
|
iscategroyloading = false;
|
|
notifyListeners();
|
|
},
|
|
);
|
|
}
|
|
|
|
//similarProduct
|
|
|
|
List<BannerData> banner = [];
|
|
bool isBannerLoading = true;
|
|
|
|
Future<void> getBanners(BuildContext context) async {
|
|
var data = {};
|
|
|
|
var result = await _homeRepo.getBanners(data, context);
|
|
return result.fold(
|
|
(error) {
|
|
isBannerLoading = false;
|
|
notifyListeners();
|
|
},
|
|
(response) {
|
|
banner = response.data!;
|
|
isBannerLoading = false;
|
|
notifyListeners();
|
|
},
|
|
);
|
|
}
|
|
|
|
Future<bool> customerLogOut(BuildContext context) async {
|
|
context.showLoader(show: true);
|
|
|
|
var data = {};
|
|
|
|
try {
|
|
var result = await _homeRepo.customerLogOut(data);
|
|
|
|
context.showLoader(show: false);
|
|
|
|
return result.fold(
|
|
(error) {
|
|
// Show error Snackbar
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text(error.message),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
return false; // Login failed
|
|
},
|
|
(response) async {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text("Store created successful!"),
|
|
backgroundColor: Colors.green,
|
|
),
|
|
);
|
|
await SharedPrefUtils.clear();
|
|
context.clearAndPush(routePath: MyRoutes.SIGNUP);
|
|
|
|
return true;
|
|
},
|
|
);
|
|
} catch (e) {
|
|
context.showLoader(show: false);
|
|
print("Unexpected error: $e");
|
|
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text("Something went wrong. Please try again."),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
int _activeIndex = 0;
|
|
|
|
int get activeIndex => _activeIndex;
|
|
|
|
void setActiveIndex(int index) {
|
|
_activeIndex = index;
|
|
notifyListeners();
|
|
}
|
|
|
|
// Mock API call
|
|
Future<bool> addToWish(BuildContext context, String productId) async {
|
|
var data = {
|
|
"productId": productId,
|
|
};
|
|
|
|
try {
|
|
var result = await _homeRepo.addToWish(data);
|
|
|
|
return result.fold(
|
|
(error) {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text(error.message),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
return false;
|
|
},
|
|
(response) {
|
|
iswishloading = false;
|
|
Fluttertoast.showToast(
|
|
msg: "Wishlist updated successfully!",
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
gravity: ToastGravity.BOTTOM,
|
|
backgroundColor: Colors.green,
|
|
textColor: Colors.white,
|
|
fontSize: 14.0,
|
|
);
|
|
|
|
return true;
|
|
},
|
|
);
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
Set<String> wishlist = {};
|
|
|
|
bool iswishloading = false;
|
|
|
|
Future<void> toggleWishlist(BuildContext context, String productId) async {
|
|
iswishloading = true;
|
|
notifyListeners();
|
|
try {
|
|
if (wishlist.contains(productId)) {
|
|
wishlist.remove(productId);
|
|
iswishloading = false;
|
|
} else {
|
|
var result = await addToWish(context, productId);
|
|
|
|
wishlist.add(productId);
|
|
}
|
|
iswishloading = false;
|
|
notifyListeners();
|
|
} catch (e) {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text("Something went wrong. Please try again."),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
// void toggleWishlist1(String productId)
|
|
// {
|
|
// for (var product in products) {
|
|
// if (product.id == productId) {
|
|
// product.isInWishlist = !product.isInWishlist; // Toggle value
|
|
// notifyListeners(); // Refresh UI
|
|
// break;
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// Future<bool> addToCart(BuildContext context, String productId) async
|
|
// {
|
|
// //context.showLoader(show: true);
|
|
|
|
// var data =
|
|
// {
|
|
// "productId": productId, "quantity": 1};
|
|
|
|
// try {
|
|
// var result = await _homeRepo.addToCart(data);
|
|
|
|
// return result.fold(
|
|
// (error) {
|
|
// ScaffoldMessenger.of(context).showSnackBar(
|
|
// SnackBar(
|
|
// content: Text(error.message),
|
|
// backgroundColor: Colors.red,
|
|
// ),
|
|
// );
|
|
// return false;
|
|
// },
|
|
// (response) {
|
|
// Fluttertoast.showToast(
|
|
// msg: "Wishlist updated successfully!",
|
|
// toastLength: Toast.LENGTH_SHORT,
|
|
// gravity: ToastGravity.BOTTOM,
|
|
// backgroundColor: Colors.green,
|
|
// textColor: Colors.white,
|
|
// fontSize: 14.0,
|
|
// );
|
|
|
|
// return true;
|
|
// },
|
|
// );
|
|
// } catch (e) {
|
|
// return false;
|
|
// }
|
|
// }
|
|
|
|
Set<String> cartItems = {};
|
|
Map<String, bool> isLoading = {};
|
|
|
|
bool isLoadingCart = false;
|
|
bool iscardAdded = false;
|
|
|
|
Future<void> addToCart(
|
|
BuildContext context, String productId, int quantity) async {
|
|
//if (cartItems.contains(productId)) return; // Prevent duplicate additions
|
|
isLoadingCart = true;
|
|
isLoading[productId] = true;
|
|
notifyListeners(); // Notify UI to show loading indicator
|
|
|
|
var data = {"productId": productId, "quantity": quantity};
|
|
|
|
try {
|
|
var result = await _homeRepo.addToCart(data);
|
|
|
|
result.fold(
|
|
(error) {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text(error.message),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
},
|
|
(response) {
|
|
cartItems.add(productId); // Add product to cart
|
|
Fluttertoast.showToast(
|
|
msg: "Added to cart successfully!",
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
gravity: ToastGravity.BOTTOM,
|
|
backgroundColor: Colors.green,
|
|
textColor: Colors.white,
|
|
fontSize: 14.0,
|
|
);
|
|
iscardAdded = true;
|
|
notifyListeners(); // Update UI after adding to cart
|
|
},
|
|
);
|
|
} catch (e) {
|
|
Fluttertoast.showToast(
|
|
msg: "Insufficient stock!",
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
gravity: ToastGravity.CENTER,
|
|
backgroundColor: Colors.red,
|
|
textColor: Colors.white,
|
|
fontSize: 14.0,
|
|
);
|
|
} finally {
|
|
isLoadingCart = false;
|
|
isLoading[productId] = false;
|
|
notifyListeners(); // Ensure UI updates after operation
|
|
}
|
|
}
|
|
|
|
List<BestDeal> countList = [];
|
|
String lastImageurl = '';
|
|
|
|
Future<void> addToWithCart(BuildContext context, String productId,
|
|
BestDeal bestdealproduct, url) async {
|
|
isLoading[productId] = true;
|
|
notifyListeners();
|
|
|
|
var data = {"productId": productId, "quantity": 1};
|
|
|
|
try {
|
|
var result = await _homeRepo.addToCart(data);
|
|
|
|
result.fold(
|
|
(error) {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text(error.message),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
},
|
|
(response) {
|
|
countList.add(bestdealproduct);
|
|
lastImageurl = url;
|
|
cartItems.add(productId); // Add product to cart
|
|
Fluttertoast.showToast(
|
|
msg: "Added to cart successfully!",
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
gravity: ToastGravity.BOTTOM,
|
|
backgroundColor: Colors.green,
|
|
textColor: Colors.white,
|
|
fontSize: 14.0,
|
|
);
|
|
notifyListeners(); // Update UI after adding to cart
|
|
},
|
|
);
|
|
} catch (e) {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text("Product already added"),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
} finally {
|
|
isLoading[productId] = false;
|
|
notifyListeners(); // Ensure UI updates after operation
|
|
}
|
|
}
|
|
|
|
List<ProductDatum> productDatum = [];
|
|
String productDatumlastImageurl = '';
|
|
|
|
Future<void> addToCartWithWishlist(BuildContext context, String productId,
|
|
ProductDatum productdataum, url) async {
|
|
isLoading[productId] = true;
|
|
notifyListeners();
|
|
|
|
var data = {"productId": productId, "quantity": 1};
|
|
|
|
try {
|
|
var result = await _homeRepo.addToCart(data);
|
|
|
|
result.fold(
|
|
(error) {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text(error.message),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
},
|
|
(response) {
|
|
productDatum.add(productdataum);
|
|
productDatumlastImageurl = url;
|
|
cartItems.add(productId); // Add product to cart
|
|
Fluttertoast.showToast(
|
|
msg: "Added to cart successfully!",
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
gravity: ToastGravity.BOTTOM,
|
|
backgroundColor: Colors.green,
|
|
textColor: Colors.white,
|
|
fontSize: 14.0,
|
|
);
|
|
notifyListeners(); // Update UI after adding to cart
|
|
},
|
|
);
|
|
} catch (e) {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text("Something went wrong"),
|
|
backgroundColor: Colors.red,
|
|
),
|
|
);
|
|
} finally {
|
|
isLoading[productId] = false;
|
|
notifyListeners(); // Ensure UI updates after operation
|
|
}
|
|
}
|
|
|
|
bool isWishListItemLoadingg = true;
|
|
|
|
List<WishListItem> wishListItem = [];
|
|
|
|
int totalItems = 0;
|
|
|
|
Future<void> gettAllWishList(BuildContext context) async {
|
|
var data = {};
|
|
|
|
try {
|
|
var result = await _homeRepo.gettAllWishList(data);
|
|
|
|
return result.fold(
|
|
(error) {
|
|
print("sdfgdfgfdggf");
|
|
isWishListItemLoadingg = false;
|
|
notifyListeners();
|
|
},
|
|
(response) {
|
|
print("lsjfdgjsdfsdfgkdfkgkjkf");
|
|
wishListItem = response.items!;
|
|
totalItems = response.totalItems;
|
|
isWishListItemLoadingg = false;
|
|
notifyListeners();
|
|
},
|
|
);
|
|
} catch (e) {
|
|
isWishListItemLoadingg = false;
|
|
notifyListeners();
|
|
print("jdsgkdfkghk");
|
|
}
|
|
}
|
|
////////////////////////////// product increase ////////////////////////////////////
|
|
|
|
int quantitys = 1;
|
|
double _unitPrice = 0.0;
|
|
double _totalPrice = 0.0;
|
|
|
|
int get quantity => quantitys;
|
|
double get totalPrice => _totalPrice;
|
|
|
|
void setProductPrice(double price) {
|
|
_unitPrice = price;
|
|
_totalPrice = _unitPrice * quantitys;
|
|
notifyListeners();
|
|
}
|
|
|
|
int productQuantity = 0;
|
|
|
|
// void increaseQuantity()
|
|
// {
|
|
// if(quantity<10)
|
|
// if (_quantity < 10)
|
|
// {
|
|
// // Limit to 10
|
|
// _quantity++;
|
|
// _totalPrice = _unitPrice * _quantity;
|
|
// notifyListeners();
|
|
// }
|
|
// {
|
|
// Fluttertoast.showToast(
|
|
// msg: "Sorry cart successfully!",
|
|
// toastLength: Toast.LENGTH_SHORT,
|
|
// gravity: ToastGravity.BOTTOM,
|
|
// backgroundColor: Colors.green,
|
|
// textColor: Colors.white,
|
|
// fontSize: 14.0,
|
|
// );
|
|
|
|
// }
|
|
// }
|
|
|
|
void increaseQuantity() {
|
|
int maxAllowed = productQuantity >= 100
|
|
? 10
|
|
: productQuantity; // Max limit based on stock
|
|
|
|
if (quantitys < maxAllowed) {
|
|
quantitys++;
|
|
_totalPrice = _unitPrice * quantitys;
|
|
notifyListeners();
|
|
} else {
|
|
Fluttertoast.showToast(
|
|
msg: "Sorry, you can only add up to $maxAllowed items!",
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
gravity: ToastGravity.BOTTOM,
|
|
backgroundColor: Colors.red,
|
|
textColor: Colors.white,
|
|
fontSize: 14.0,
|
|
);
|
|
}
|
|
}
|
|
|
|
void decreaseQuantity() {
|
|
if (quantitys > 1) {
|
|
quantitys--;
|
|
_totalPrice = _unitPrice * quantitys;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////similar product//////////////////////
|
|
|
|
List<Product> similarProductlist = [];
|
|
|
|
Future<void> similarProductprovider(BuildContext context, String id) async {
|
|
var data = {};
|
|
|
|
var result = await _homeRepo.similarProduct(data, context, id);
|
|
return result.fold(
|
|
(error) {
|
|
// isLoadingg = false;
|
|
notifyListeners();
|
|
},
|
|
(response) {
|
|
print("jkshdfkhdjkfkjdfkgkjdfjgk ${response}");
|
|
|
|
similarProductlist = response! as List<Product>;
|
|
// isLoadingg = false;
|
|
notifyListeners();
|
|
},
|
|
);
|
|
}
|
|
|
|
///////////////////////////////////////////////////// all filter ////////////////////////
|
|
|
|
int _selectedIndex = 0;
|
|
|
|
int get selectedIndex => _selectedIndex;
|
|
|
|
void setSelectedIndex(BuildContext context, int index) {
|
|
_selectedIndex = index;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> determinePosition() async {
|
|
bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
|
|
if (!serviceEnabled) {
|
|
return;
|
|
}
|
|
|
|
LocationPermission permission = await Geolocator.requestPermission();
|
|
if (permission == LocationPermission.denied) {
|
|
return;
|
|
}
|
|
|
|
Position position = await Geolocator.getCurrentPosition(
|
|
desiredAccuracy: LocationAccuracy.high,
|
|
);
|
|
LatLng currentLatLng = LatLng(position.latitude, position.longitude);
|
|
|
|
_getAddressFromLatLng(position.latitude, position.longitude);
|
|
}
|
|
|
|
String googleApiKey = "AIzaSyAi3_Dls63iGs7Nccgdm-4FkS0rhT03-4U";
|
|
|
|
String getCurrentAdd = '';
|
|
|
|
Future<void> _getAddressFromLatLng(double lat, double lng) async {
|
|
final String url =
|
|
"https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=$googleApiKey";
|
|
|
|
try {
|
|
final response = await http.get(Uri.parse(url));
|
|
if (response.statusCode == 200) {
|
|
final data = json.decode(response.body);
|
|
if (data["status"] == "OK") {
|
|
var result = data["results"][0]; // First result is most accurate
|
|
|
|
// _RoadController.text = result["formatted_address"];
|
|
List components = result["address_components"];
|
|
|
|
String roadName = "";
|
|
String colony = "";
|
|
String buildingName = "";
|
|
String pincode = "";
|
|
|
|
for (var component in components) {
|
|
List types = component["types"];
|
|
if (types.contains("route")) {
|
|
roadName = component["long_name"]; // Road Name
|
|
} else if (types.contains("sublocality_level_1") ||
|
|
types.contains("locality")) {
|
|
colony = component["long_name"]; // Colony Name
|
|
} else if (types.contains("premise") ||
|
|
types.contains("street_number")) {
|
|
buildingName = component["long_name"]; // Building Name
|
|
} else if (types.contains("postal_code")) {
|
|
pincode = component["long_name"]; // Extract Pin Code
|
|
}
|
|
}
|
|
|
|
// setState(() {
|
|
// // _address = formattedAddress;
|
|
// _roadName = roadName;
|
|
// _colony = colony;
|
|
// _buildingName = buildingName;
|
|
// });
|
|
|
|
getCurrentAdd = result["formatted_address"] + pincode;
|
|
notifyListeners();
|
|
|
|
print(
|
|
"Full Address: ${result["formatted_address"]} ${response.body} sdfsgd ${pincode}");
|
|
print("Road Name: $roadName");
|
|
print("Colony: $colony");
|
|
print("Building Name: $buildingName");
|
|
} else {}
|
|
} else {}
|
|
} catch (e) {
|
|
print("Error fetching address: $e");
|
|
}
|
|
}
|
|
}
|