This commit is contained in:
Juan Felipe Duarte
2023-04-04 09:18:33 -05:00
parent 9656a85090
commit 50737e03dd
7 changed files with 304 additions and 155 deletions
+95 -140
View File
@@ -11,162 +11,90 @@ class CityScreen extends StatefulWidget {
State<CityScreen> createState() => _CityScreenState();
}
List<String> cities = [
"Abrego",
"Aguada",
"Albania",
"Aratoca",
"Arboledas",
"Barbosa",
"Barichara",
"Barrancabermeja",
"Betulia",
"Bochalema",
"Bolivar",
"Bucaramanga",
"Bucarasica",
"Cabrera",
"Cachira",
"Cacota",
"California",
"Capitanejo",
"Carcasi",
"Cepita",
"Cerrito",
"Charala",
"Charta",
"Chima",
"Chinácota",
"Chipata",
"Chitagá",
"Cimitarra",
"Concepcion",
"Confines",
"Contratacion",
"Convención",
"Coromoro",
"Cucutilla",
"Cúcuta",
"Curiti",
"Durania",
"El Carmen",
"El Carmen de Chucuri",
"El Guacamayo",
"El Penon",
"El Playon",
"El Tarra",
"El Zulia",
"Encino",
"Enciso",
"Florian",
"Floridablanca",
"Galán",
"Gambita",
"Giron",
"Gramalote",
"Guaca",
"Guadalupe",
"Guapota",
"Guavata",
"Guepsa",
"Hacarí",
"Hato",
"Herrán",
"Jesús Maria",
"Jordan",
"La Belleza",
"La Esperanza",
"La Paz",
"La Playa",
"Landazuri",
"Labateca",
"Lebrija",
"Los Patios",
"Los Santos",
"Lourdes",
"Macaravita",
"Malaga",
"Matanza",
"Mogotes",
"Molagavita",
"Mutiscua",
"Ocaña",
"Ocamonte",
"Oiba",
"Onzaga",
"Pamplona",
"Pamplonita",
"Palmar",
"Palmas del Socorro",
"Paramo",
"Piedecuesta",
"Pinchote",
"Puente Nacional",
"Puerto Parra",
"Puerto Santander",
"Puerto Wilches",
"Ragonvalia",
"Rionegro",
"Sabana de Torres",
"Salazar",
"San Andres",
"San Benito",
"San Calixto",
"San Cayetano",
"San Gil",
"San Joaquin",
"San Jose de Miranda",
"San Miguel",
"San Vicente de Chucuri",
"Santa Barbara",
"Santa Helena del Opon",
"Santiago",
"Sardinata",
"Silos",
"Simacota",
"Socorro",
"Surata",
"Suaita",
"Sucre",
"Tibú",
"Tona",
"Toledo",
"Valle de San Jose",
"Velez",
"Vetas",
"Villa Caro",
"Villa del Rosario",
"Zapatoca",
"Villanueva",
];
final CollectionReference countriesCollection =
FirebaseFirestore.instance.collection('countries');
class City {
final String name;
City({required this.name});
String? cityName;
String? stateOfCity;
String? countryOfCity;
City({this.cityName, this.stateOfCity, this.countryOfCity});
@override
String toString() {
return "${cityName ?? ""}, ${stateOfCity ?? ""}, ${countryOfCity ?? ""}";
}
}
List<City> citiesList = cities.map((city) => City(name: city)).toList();
Future<List<City>> getCountries() async {
List<City> citys = [];
try {
QuerySnapshot countries = await countriesCollection.get();
for (DocumentSnapshot country in countries.docs) {
String countryName = country.id;
Map<String, dynamic> data = country.data() as Map<String, dynamic>;
Map<String, List<String>> states = {};
for (var entry in data.entries) {
String key = entry.key;
List<String> value = List<String>.from(entry.value);
states[key] = value;
}
for (var state in states.entries) {
var citysState = state.value
.map((cityName) => City(
cityName: cityName,
stateOfCity: state.key,
countryOfCity: countryName))
.toList();
citys.addAll(citysState);
}
}
} catch (e) {
print('xd $e');
}
return citys;
}
class _CityScreenState extends State<CityScreen> {
List<City> filteredCities = citiesList;
List<City>? filteredCities;
TextEditingController searchController = TextEditingController();
final User? user = FirebaseAuth.instance.currentUser;
late final FirebaseAuth _auth;
final uid = AuthenticationRepository.instance.getCurrentUserUid();
List<City>? _cities;
@override
void initState() {
super.initState();
searchController.addListener(() {
setState(() {
filteredCities = citiesList
.where((city) => removeDiacritics(city.name).toLowerCase().contains(
removeDiacritics(searchController.text.toLowerCase())))
.toList();
if (_cities != null) {
if (searchController.text.isEmpty) {
filteredCities = _cities!;
} else {
filteredCities = _cities!
.where((city) => removeDiacritics(city.cityName!)
.toLowerCase()
.contains(
removeDiacritics(searchController.text.toLowerCase())))
.toList();
}
}
});
});
if (_cities == null) {
getCountries().then((List<City> element) => setState(() {
_cities = element;
filteredCities = element;
}));
}
}
Future<void> updateCity(String cityName) async {
@@ -193,6 +121,15 @@ class _CityScreenState extends State<CityScreen> {
@override
Widget build(BuildContext context) {
if (filteredCities == null) {
return const Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.red),
),
);
}
var citys = filteredCities!;
return SafeArea(
child: Scaffold(
appBar: AppBar(
@@ -226,12 +163,30 @@ class _CityScreenState extends State<CityScreen> {
),
Expanded(
child: ListView.builder(
itemCount: filteredCities.length,
itemCount: citys.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(filteredCities[index].name),
title: RichText(
text: TextSpan(
style: const TextStyle(
fontSize: 18.0,
color: Colors.black,
),
children: <TextSpan>[
TextSpan(
text: '${citys[index].cityName ?? ""}, ',
style: const TextStyle(fontWeight: FontWeight.bold),
),
TextSpan(
text:
"${citys[index].stateOfCity ?? ""}, ${citys[index].countryOfCity ?? ""}",
style: TextStyle(color: Colors.grey[600]),
),
],
),
),
onTap: () {
updateCity(filteredCities[index].name);
updateCity(citys[index].cityName ?? "");
Navigator.pushReplacementNamed(context, '/profile');
},
);