From f77d09d14730f6d93d21d3053c8835e661259fce Mon Sep 17 00:00:00 2001 From: Yoshi Date: Sun, 11 Feb 2024 22:00:37 +0300 Subject: [PATCH] Add start search city --- assets/icons/Search.png | Bin 0 -> 40608 bytes lib/app/controller/controller.dart | 31 +++ lib/app/modules/geolocation.dart | 386 +++++++++++++++++++++++++++++ lib/app/modules/onboarding.dart | 4 +- lib/main.dart | 13 +- lib/translation/cs_cz.dart | 2 + lib/translation/de_de.dart | 2 + lib/translation/en_us.dart | 2 + lib/translation/es_es.dart | 2 + lib/translation/fr_fr.dart | 2 + lib/translation/ga_ie.dart | 2 + lib/translation/hi_in.dart | 2 + lib/translation/hu_hu.dart | 2 + lib/translation/it_it.dart | 2 + lib/translation/ka_ge.dart | 2 + lib/translation/nl_nl.dart | 2 + lib/translation/pl_pl.dart | 2 + lib/translation/pt_br.dart | 2 + lib/translation/ro_ro.dart | 2 + lib/translation/ru_ru.dart | 2 + lib/translation/sk_sk.dart | 2 + lib/translation/tr_tr.dart | 2 + lib/translation/ur_pk.dart | 2 + lib/translation/zh_ch.dart | 2 + pubspec.lock | 4 +- 25 files changed, 471 insertions(+), 5 deletions(-) create mode 100644 assets/icons/Search.png create mode 100644 lib/app/modules/geolocation.dart diff --git a/assets/icons/Search.png b/assets/icons/Search.png new file mode 100644 index 0000000000000000000000000000000000000000..5d42616eb7cbf9462d96fa9e862a81081d76750f GIT binary patch literal 40608 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 s*wcck{&`472->0n{ZIS)|2XGNvf@*Def getCurrentLocationSearch() async { + bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); + double lat, lon; + String city, district; + + if (!isOnline) { + showSnackBar(content: 'no_inter'.tr); + } + + if (!serviceEnabled) { + showSnackBar( + content: 'no_location'.tr, + onPressed: () => Geolocator.openLocationSettings(), + ); + } + + Position position = await determinePosition(); + List placemarks = + await placemarkFromCoordinates(position.latitude, position.longitude); + Placemark place = placemarks[0]; + + lat = position.latitude; + lon = position.longitude; + city = '${place.administrativeArea}'; + district = '${place.locality}'; + + Map location = {'lat': lat, 'lon': lon, 'city': city, 'district': district}; + + return location; + } + Future getLocation(double latitude, double longitude, String district, String locality) async { if (!isOnline) { diff --git a/lib/app/modules/geolocation.dart b/lib/app/modules/geolocation.dart new file mode 100644 index 0000000..c419bcb --- /dev/null +++ b/lib/app/modules/geolocation.dart @@ -0,0 +1,386 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:iconsax/iconsax.dart'; +import 'package:rain/app/api/api.dart'; +import 'package:rain/app/api/city.dart'; +import 'package:rain/app/controller/controller.dart'; +import 'package:rain/app/modules/home.dart'; +import 'package:rain/app/widgets/button.dart'; +import 'package:rain/app/widgets/text_form.dart'; +import 'package:rain/main.dart'; + +class SelectGeolocation extends StatefulWidget { + const SelectGeolocation({super.key}); + + @override + State createState() => _SelectGeolocationState(); +} + +class _SelectGeolocationState extends State { + bool isLoading = false; + final formKeySearch = GlobalKey(); + final _focusNode = FocusNode(); + final weatherController = Get.put(WeatherController()); + final _controller = TextEditingController(); + final _controllerLat = TextEditingController(); + final _controllerLon = TextEditingController(); + final _controllerCity = TextEditingController(); + final _controllerDistrict = TextEditingController(); + + textTrim(value) { + value.text = value.text.trim(); + while (value.text.contains(' ')) { + value.text = value.text.replaceAll(' ', ' '); + } + } + + void fillController(selection) { + _controllerLat.text = '${selection.latitude}'; + _controllerLon.text = '${selection.longitude}'; + _controllerCity.text = selection.name; + _controllerDistrict.text = selection.admin1; + _controller.clear(); + _focusNode.unfocus(); + setState(() {}); + } + + void fillControllerGeo(location) { + _controllerLat.text = '${location['lat']}'; + _controllerLon.text = '${location['lon']}'; + _controllerCity.text = location['district']; + _controllerDistrict.text = location['city']; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + const kTextFieldElevation = 4.0; + return Form( + key: formKeySearch, + child: Scaffold( + resizeToAvoidBottomInset: true, + appBar: AppBar( + centerTitle: true, + automaticallyImplyLeading: false, + title: Text( + 'searchCity'.tr, + style: context.textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.w600, + fontSize: 18, + ), + ), + ), + body: SafeArea( + child: Stack( + children: [ + Column( + children: [ + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Flexible( + child: SingleChildScrollView( + child: Column( + children: [ + Image.asset( + 'assets/icons/Search.png', + scale: 7, + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, horizontal: 10), + child: Text( + 'searchMethod'.tr, + style: context.theme.textTheme.bodyLarge + ?.copyWith(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + ), + Row( + children: [ + Flexible( + child: RawAutocomplete( + focusNode: _focusNode, + textEditingController: _controller, + fieldViewBuilder: (BuildContext context, + TextEditingController + fieldTextEditingController, + FocusNode fieldFocusNode, + VoidCallback onFieldSubmitted) { + return MyTextForm( + elevation: kTextFieldElevation, + labelText: 'search'.tr, + type: TextInputType.text, + icon: const Icon( + Iconsax.global_search), + controller: _controller, + margin: const EdgeInsets.only( + left: 10, right: 10, top: 10), + focusNode: _focusNode, + ); + }, + optionsBuilder: (TextEditingValue + textEditingValue) { + if (textEditingValue.text.isEmpty) { + return const Iterable< + Result>.empty(); + } + return WeatherAPI().getCity( + textEditingValue.text, locale); + }, + onSelected: (Result selection) => + fillController(selection), + displayStringForOption: (Result + option) => + '${option.name}, ${option.admin1}', + optionsViewBuilder: + (BuildContext context, + AutocompleteOnSelected + onSelected, + Iterable options) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10), + child: Align( + alignment: Alignment.topCenter, + child: Material( + borderRadius: + BorderRadius.circular(20), + elevation: 4.0, + child: ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: options.length, + itemBuilder: + (BuildContext context, + int index) { + final Result option = + options + .elementAt(index); + return InkWell( + onTap: () => + onSelected(option), + child: ListTile( + title: Text( + '${option.name}, ${option.admin1}', + style: context + .textTheme + .labelLarge, + ), + ), + ); + }, + ), + ), + ), + ); + }, + ), + ), + Card( + elevation: kTextFieldElevation, + margin: const EdgeInsets.only( + top: 10, right: 10), + child: Container( + margin: const EdgeInsets.all(2.5), + child: IconButton( + onPressed: () async { + bool serviceEnabled = + await Geolocator + .isLocationServiceEnabled(); + if (!serviceEnabled) { + if (!mounted) return; + await showAdaptiveDialog( + context: context, + builder: + (BuildContext context) { + return AlertDialog.adaptive( + title: Text( + 'location'.tr, + style: context + .textTheme.titleLarge, + ), + content: Text( + 'no_location'.tr, + style: context.textTheme + .titleMedium), + actions: [ + TextButton( + onPressed: () => + Get.back( + result: false), + child: Text( + 'cancel'.tr, + style: context + .textTheme + .titleMedium + ?.copyWith( + color: Colors + .blueAccent), + ), + ), + TextButton( + onPressed: () { + Geolocator + .openLocationSettings(); + Get.back( + result: true); + }, + child: Text( + 'settings'.tr, + style: context + .textTheme + .titleMedium + ?.copyWith( + color: Colors + .green), + ), + ), + ], + ); + }, + ); + return; + } + setState(() => isLoading = true); + final location = + await weatherController + .getCurrentLocationSearch(); + fillControllerGeo(location); + setState(() => isLoading = false); + }, + icon: const Icon( + Iconsax.location, + ), + ), + ), + ), + ], + ), + MyTextForm( + elevation: kTextFieldElevation, + controller: _controllerLat, + labelText: 'lat'.tr, + type: TextInputType.number, + icon: const Icon(Iconsax.location), + margin: const EdgeInsets.only( + left: 10, right: 10, top: 10), + validator: (value) { + if (value == null || value.isEmpty) { + return 'validateValue'.tr; + } + double? numericValue = + double.tryParse(value); + if (numericValue == null) { + return 'validateNumber'.tr; + } + if (numericValue < -90 || + numericValue > 90) { + return 'validate90'.tr; + } + return null; + }, + ), + MyTextForm( + elevation: kTextFieldElevation, + controller: _controllerLon, + labelText: 'lon'.tr, + type: TextInputType.number, + icon: const Icon(Iconsax.location), + margin: const EdgeInsets.only( + left: 10, right: 10, top: 10), + validator: (value) { + if (value == null || value.isEmpty) { + return 'validateValue'.tr; + } + double? numericValue = + double.tryParse(value); + if (numericValue == null) { + return 'validateNumber'.tr; + } + if (numericValue < -180 || + numericValue > 180) { + return 'validate180'.tr; + } + return null; + }, + ), + MyTextForm( + elevation: kTextFieldElevation, + controller: _controllerCity, + labelText: 'city'.tr, + type: TextInputType.name, + icon: const Icon(Icons.location_city_rounded), + margin: const EdgeInsets.only( + left: 10, right: 10, top: 10), + validator: (value) { + if (value == null || value.isEmpty) { + return 'validateName'.tr; + } + return null; + }, + ), + MyTextForm( + elevation: kTextFieldElevation, + controller: _controllerDistrict, + labelText: 'district'.tr, + type: TextInputType.streetAddress, + icon: const Icon(Iconsax.global), + margin: const EdgeInsets.only( + left: 10, right: 10, top: 10), + ), + const SizedBox(height: 20), + ], + ), + ), + ), + ], + ), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + child: MyTextButton( + buttonName: 'done'.tr, + onPressed: () async { + if (formKeySearch.currentState!.validate()) { + textTrim(_controllerLat); + textTrim(_controllerLon); + textTrim(_controllerCity); + textTrim(_controllerDistrict); + try { + await weatherController.deleteAll(true); + await weatherController.getLocation( + double.parse(_controllerLat.text), + double.parse(_controllerLon.text), + _controllerDistrict.text, + _controllerCity.text, + ); + Get.off(() => const HomePage(), + transition: Transition.downToUp); + } catch (error) { + Future.error(error); + } + } + }, + ), + ), + ], + ), + if (isLoading) + BackdropFilter( + filter: ImageFilter.blur(sigmaY: 3, sigmaX: 3), + child: const Center( + child: CircularProgressIndicator(), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/app/modules/onboarding.dart b/lib/app/modules/onboarding.dart index dce33c6..7bacd40 100644 --- a/lib/app/modules/onboarding.dart +++ b/lib/app/modules/onboarding.dart @@ -1,5 +1,5 @@ import 'package:rain/app/data/weather.dart'; -import 'package:rain/app/modules/home.dart'; +import 'package:rain/app/modules/geolocation.dart'; import 'package:rain/app/widgets/button.dart'; import 'package:rain/main.dart'; import 'package:flutter/material.dart'; @@ -31,7 +31,7 @@ class _OnBordingState extends State { void onBoardHome() { settings.onboard = true; isar.writeTxnSync(() => isar.settings.putSync(settings)); - Get.off(() => const HomePage(), transition: Transition.downToUp); + Get.off(() => const SelectGeolocation(), transition: Transition.downToUp); } @override diff --git a/lib/main.dart b/lib/main.dart index f2a3126..fc2d21e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,6 +13,7 @@ import 'package:home_widget/home_widget.dart'; import 'package:isar/isar.dart'; import 'package:path_provider/path_provider.dart'; import 'package:rain/app/controller/controller.dart'; +import 'package:rain/app/modules/geolocation.dart'; import 'package:rain/app/modules/home.dart'; import 'package:rain/app/modules/onboarding.dart'; import 'package:rain/theme/theme.dart'; @@ -26,6 +27,7 @@ import 'translation/translation.dart'; late Isar isar; late Settings settings; +late LocationCache locationCache; bool isOnline = false; FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = @@ -131,6 +133,8 @@ Future isarInit() async { WeatherCardSchema, ], directory: (await getApplicationSupportDirectory()).path); settings = isar.settings.where().findFirstSync() ?? Settings(); + locationCache = + isar.locationCaches.where().findFirstSync() ?? LocationCache(); if (settings.language == null) { settings.language = '${Get.deviceLocale}'; @@ -307,7 +311,14 @@ class _MyAppState extends State { supportedLocales: appLanguages.map((e) => e['locale'] as Locale).toList(), debugShowCheckedModeBanner: false, - home: settings.onboard ? const HomePage() : const OnBording(), + home: settings.onboard + ? (locationCache.city == null) || + (locationCache.district == null) || + (locationCache.lat == null) || + (locationCache.lon == null) + ? const SelectGeolocation() + : const HomePage() + : const OnBording(), ); }, ); diff --git a/lib/translation/cs_cz.dart b/lib/translation/cs_cz.dart index 19f24f2..e9a1564 100644 --- a/lib/translation/cs_cz.dart +++ b/lib/translation/cs_cz.dart @@ -122,5 +122,7 @@ class CsCz { 'roundDegree': 'Zaokrouhlit stupně', 'settings_full': 'Nastavení', 'cities': 'Města', + 'searchMethod': 'Použijte hledání nebo geolokaci', + 'done': 'Hotovo', }; } diff --git a/lib/translation/de_de.dart b/lib/translation/de_de.dart index 5d09bb7..42c57dd 100644 --- a/lib/translation/de_de.dart +++ b/lib/translation/de_de.dart @@ -124,5 +124,7 @@ class DeDe { 'roundDegree': 'Grad runden', 'settings_full': 'Einstellungen', 'cities': 'Städte', + 'searchMethod': 'Verwenden Sie die Suche oder die Geolokalisierung', + 'done': 'Fertig', }; } diff --git a/lib/translation/en_us.dart b/lib/translation/en_us.dart index 6c58e70..220f876 100644 --- a/lib/translation/en_us.dart +++ b/lib/translation/en_us.dart @@ -123,5 +123,7 @@ class EnUs { 'roundDegree': 'Round degrees', 'settings_full': 'Settings', 'cities': 'Cities', + 'searchMethod': 'Use search or geolocation', + 'done': 'Done', }; } diff --git a/lib/translation/es_es.dart b/lib/translation/es_es.dart index ee7fdf2..c98339d 100644 --- a/lib/translation/es_es.dart +++ b/lib/translation/es_es.dart @@ -124,5 +124,7 @@ class EsEs { 'roundDegree': 'Redondear grados', 'settings_full': 'Configuración', 'cities': 'Ciudades', + 'searchMethod': 'Usa la búsqueda o la geolocalización', + 'done': 'Hecho', }; } diff --git a/lib/translation/fr_fr.dart b/lib/translation/fr_fr.dart index c375864..2c5dcfe 100644 --- a/lib/translation/fr_fr.dart +++ b/lib/translation/fr_fr.dart @@ -124,5 +124,7 @@ class FrFr { 'roundDegree': 'Arrondir les degrés', 'settings_full': 'Paramètres', 'cities': 'Villes', + 'searchMethod': 'Utilisez la recherche ou la géolocalisation', + 'done': 'Terminé', }; } diff --git a/lib/translation/ga_ie.dart b/lib/translation/ga_ie.dart index db0113b..ed0817a 100644 --- a/lib/translation/ga_ie.dart +++ b/lib/translation/ga_ie.dart @@ -124,5 +124,7 @@ class GaIe { 'roundDegree': 'Timpeall na Gráid', 'settings_full': 'Socruithe', 'cities': 'Cathracha', + 'searchMethod': 'Úsáid ceangal nó geolocáid', + 'done': 'Críochnaithe', }; } diff --git a/lib/translation/hi_in.dart b/lib/translation/hi_in.dart index 6a4f3a7..8b457f1 100644 --- a/lib/translation/hi_in.dart +++ b/lib/translation/hi_in.dart @@ -121,5 +121,7 @@ class HiIn { 'roundDegree': 'डिग्री गोली मारें', 'settings_full': 'सेटिंग्स', 'cities': 'शहर', + 'searchMethod': 'खोज या स्थानगति का उपयोग करें', + 'done': 'किया', }; } diff --git a/lib/translation/hu_hu.dart b/lib/translation/hu_hu.dart index 5de9483..0d377d9 100644 --- a/lib/translation/hu_hu.dart +++ b/lib/translation/hu_hu.dart @@ -124,5 +124,7 @@ class HuHu { 'roundDegree': 'Fokok Kerekítése', 'settings_full': 'Beállítások', 'cities': 'Városok', + 'searchMethod': 'Használja a keresést vagy a földrajzi helyet', + 'done': 'Kész', }; } diff --git a/lib/translation/it_it.dart b/lib/translation/it_it.dart index 1a3e16e..52ebe3e 100644 --- a/lib/translation/it_it.dart +++ b/lib/translation/it_it.dart @@ -124,5 +124,7 @@ class ItIt { 'roundDegree': 'Arrotonda i gradi', 'settings_full': 'Impostazioni', 'cities': 'Città', + 'searchMethod': 'Utilizza la ricerca o la geolocalizzazione', + 'done': 'Fatto', }; } diff --git a/lib/translation/ka_ge.dart b/lib/translation/ka_ge.dart index 627f88a..3400d78 100644 --- a/lib/translation/ka_ge.dart +++ b/lib/translation/ka_ge.dart @@ -123,5 +123,7 @@ class KaGe { 'roundDegree': 'ხარისხი მიჯნურობა', 'settings_full': 'პარამეტრები', 'cities': 'ქალაქები', + 'searchMethod': 'გამოიყენეთ ძებნა ან გეოლოკაცია', + 'done': 'დასრულებულია', }; } diff --git a/lib/translation/nl_nl.dart b/lib/translation/nl_nl.dart index 500d858..c9e50bf 100644 --- a/lib/translation/nl_nl.dart +++ b/lib/translation/nl_nl.dart @@ -124,5 +124,7 @@ class NlNl { 'roundDegree': 'Rond graden af', 'settings_full': 'Instellingen', 'cities': 'Steden', + 'searchMethod': 'Gebruik zoeken of geolocatie', + 'done': 'Klaar', }; } diff --git a/lib/translation/pl_pl.dart b/lib/translation/pl_pl.dart index 9a438d4..4d17007 100644 --- a/lib/translation/pl_pl.dart +++ b/lib/translation/pl_pl.dart @@ -122,5 +122,7 @@ class PlPl { 'roundDegree': 'Zaokrąglaj stopnie', 'settings_full': 'Ustawienia', 'cities': 'Miasta', + 'searchMethod': 'Użyj wyszukiwania lub geolokalizacji', + 'done': 'Gotowe', }; } diff --git a/lib/translation/pt_br.dart b/lib/translation/pt_br.dart index 613f6ad..9e74e80 100644 --- a/lib/translation/pt_br.dart +++ b/lib/translation/pt_br.dart @@ -123,5 +123,7 @@ class PtBr { 'roundDegree': 'Arredondar graus', 'settings_full': 'Configurações', 'cities': 'Cidades', + 'searchMethod': 'Use a pesquisa ou a geolocalização', + 'done': 'Concluído', }; } diff --git a/lib/translation/ro_ro.dart b/lib/translation/ro_ro.dart index a50a59b..9a68c8c 100644 --- a/lib/translation/ro_ro.dart +++ b/lib/translation/ro_ro.dart @@ -122,5 +122,7 @@ class RoRo { 'roundDegree': 'Rotunjire grade', 'settings_full': 'Setări', 'cities': 'Orașe', + 'searchMethod': 'Folosiți căutarea sau geolocația', + 'done': 'Gata', }; } diff --git a/lib/translation/ru_ru.dart b/lib/translation/ru_ru.dart index 72b05b8..dbf61fb 100644 --- a/lib/translation/ru_ru.dart +++ b/lib/translation/ru_ru.dart @@ -123,5 +123,7 @@ class RuRu { 'roundDegree': 'Округлить градусы', 'settings_full': 'Настройки', 'cities': 'Города', + 'searchMethod': 'Воспользуйтесь поиском или геолокацией', + 'done': 'Готово', }; } diff --git a/lib/translation/sk_sk.dart b/lib/translation/sk_sk.dart index 3fd960b..7867fd3 100644 --- a/lib/translation/sk_sk.dart +++ b/lib/translation/sk_sk.dart @@ -122,5 +122,7 @@ class SkSk { 'roundDegree': 'Zaokrúhliť stupne', 'settings_full': 'Nastavenia', 'cities': 'Mestá', + 'searchMethod': 'Použite vyhľadávanie alebo geolokáciu', + 'done': 'Hotovo', }; } diff --git a/lib/translation/tr_tr.dart b/lib/translation/tr_tr.dart index 742ef17..e4e0205 100644 --- a/lib/translation/tr_tr.dart +++ b/lib/translation/tr_tr.dart @@ -122,5 +122,7 @@ class TrTr { 'roundDegree': 'Dereceleri yuvarla', 'settings_full': 'Ayarlar', 'cities': 'Şehirler', + 'searchMethod': 'Arama veya konum belirleme kullanın', + 'done': 'Tamam', }; } diff --git a/lib/translation/ur_pk.dart b/lib/translation/ur_pk.dart index 7dee321..b3b95c1 100644 --- a/lib/translation/ur_pk.dart +++ b/lib/translation/ur_pk.dart @@ -123,5 +123,7 @@ class UrPk { 'roundDegree': 'ڈگری گھیریں', 'settings_full': 'ترتیبات', 'cities': 'شہر', + 'searchMethod': 'تلاش یا جغرافیائی مقام استعمال کریں', + 'done': 'ہوگیا', }; } diff --git a/lib/translation/zh_ch.dart b/lib/translation/zh_ch.dart index 5660e00..dcada96 100644 --- a/lib/translation/zh_ch.dart +++ b/lib/translation/zh_ch.dart @@ -118,5 +118,7 @@ class ZhCh { 'roundDegree': '四舍五入度数', 'settings_full': '设置', 'cities': '城市', + 'searchMethod': '使用搜索或地理定位', + 'done': '完成', }; } diff --git a/pubspec.lock b/pubspec.lock index 6c32a38..3243ed5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -569,10 +569,10 @@ packages: dependency: transitive description: name: image - sha256: "49a0d4b0c12402853d3f227fe7c315601b238d126aa4caa5dbb2dcf99421aa4a" + sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" url: "https://pub.dev" source: hosted - version: "4.1.6" + version: "4.1.7" intl: dependency: "direct main" description: