Rain/lib/app/ui/main/view/main.dart

179 lines
7.3 KiB
Dart
Raw Normal View History

2023-06-17 20:57:57 +03:00
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rain/app/controller/controller.dart';
2024-09-06 22:07:50 +03:00
import 'package:rain/app/data/db.dart';
import 'package:rain/app/ui/widgets/weather/daily/daily_card_list.dart';
import 'package:rain/app/ui/widgets/weather/daily/daily_container.dart';
import 'package:rain/app/ui/widgets/weather/desc/desc_container.dart';
import 'package:rain/app/ui/widgets/weather/hourly.dart';
import 'package:rain/app/ui/widgets/weather/now.dart';
import 'package:rain/app/ui/widgets/shimmer.dart';
import 'package:rain/app/ui/widgets/weather/sunset_sunrise.dart';
2023-06-17 20:57:57 +03:00
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
2024-09-06 22:07:50 +03:00
class MainPage extends StatefulWidget {
const MainPage({super.key});
2023-06-17 20:57:57 +03:00
@override
2024-09-06 22:07:50 +03:00
State<MainPage> createState() => _MainPageState();
2023-06-17 20:57:57 +03:00
}
2024-09-06 22:07:50 +03:00
class _MainPageState extends State<MainPage> {
2023-09-01 20:18:40 +03:00
final weatherController = Get.put(WeatherController());
2023-06-17 20:57:57 +03:00
@override
Widget build(BuildContext context) {
return RefreshIndicator(
onRefresh: () async {
2023-09-01 20:18:40 +03:00
await weatherController.deleteAll(false);
await weatherController.setLocation();
2023-06-17 20:57:57 +03:00
setState(() {});
},
2023-09-29 15:45:50 +03:00
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
2024-01-05 18:55:14 +03:00
child: Obx(() {
if (weatherController.isLoading.isTrue) {
return ListView(
children: const [
2025-03-15 23:40:48 +03:00
MyShimmer(hight: 200),
2024-01-05 18:55:14 +03:00
MyShimmer(
hight: 130,
edgeInsetsMargin: EdgeInsets.symmetric(vertical: 15),
),
MyShimmer(
hight: 90,
edgeInsetsMargin: EdgeInsets.only(bottom: 15),
),
MyShimmer(
hight: 400,
edgeInsetsMargin: EdgeInsets.only(bottom: 15),
),
MyShimmer(
hight: 450,
edgeInsetsMargin: EdgeInsets.only(bottom: 15),
2025-03-15 23:40:48 +03:00
),
2024-01-05 18:55:14 +03:00
],
);
}
2024-01-05 18:55:14 +03:00
final mainWeather = weatherController.mainWeather;
final weatherCard = WeatherCard.fromJson(mainWeather.toJson());
final hourOfDay = weatherController.hourOfDay.value;
final dayOfNow = weatherController.dayOfNow.value;
final sunrise = mainWeather.sunrise![dayOfNow];
final sunset = mainWeather.sunset![dayOfNow];
2024-06-23 23:23:43 +03:00
final tempMax = mainWeather.temperature2MMax![dayOfNow];
final tempMin = mainWeather.temperature2MMin![dayOfNow];
2024-01-05 18:55:14 +03:00
return ListView(
children: [
2024-09-06 22:07:50 +03:00
Now(
2024-01-05 18:55:14 +03:00
time: mainWeather.time![hourOfDay],
weather: mainWeather.weathercode![hourOfDay],
degree: mainWeather.temperature2M![hourOfDay],
feels: mainWeather.apparentTemperature![hourOfDay]!,
2024-01-05 18:55:14 +03:00
timeDay: sunrise,
timeNight: sunset,
2024-06-23 23:23:43 +03:00
tempMax: tempMax!,
tempMin: tempMin!,
2024-01-05 18:55:14 +03:00
),
Card(
2024-06-23 23:23:43 +03:00
margin: const EdgeInsets.only(bottom: 15),
2024-01-05 18:55:14 +03:00
child: Padding(
2025-03-15 23:40:48 +03:00
padding: const EdgeInsets.symmetric(
horizontal: 10,
vertical: 5,
),
2024-01-05 18:55:14 +03:00
child: SizedBox(
height: 135,
child: ScrollablePositionedList.separated(
key: const PageStorageKey(0),
separatorBuilder: (BuildContext context, int index) {
return const VerticalDivider(
width: 10,
indent: 40,
endIndent: 40,
);
},
scrollDirection: Axis.horizontal,
itemScrollController:
weatherController.itemScrollController,
itemCount: mainWeather.time!.length,
itemBuilder: (ctx, i) {
final i24 = (i / 24).floor();
return GestureDetector(
onTap: () {
weatherController.hourOfDay.value = i;
weatherController.dayOfNow.value = i24;
setState(() {});
},
2024-01-05 18:55:14 +03:00
child: Container(
margin: const EdgeInsets.symmetric(vertical: 5),
padding: const EdgeInsets.symmetric(
horizontal: 20,
vertical: 5,
),
decoration: BoxDecoration(
2025-03-15 23:40:48 +03:00
color:
i == hourOfDay
? context
.theme
.colorScheme
.secondaryContainer
: Colors.transparent,
2024-01-05 18:55:14 +03:00
borderRadius: const BorderRadius.all(
Radius.circular(20),
),
),
2024-09-06 22:07:50 +03:00
child: Hourly(
2024-01-05 18:55:14 +03:00
time: mainWeather.time![i],
weather: mainWeather.weathercode![i],
degree: mainWeather.temperature2M![i],
timeDay: mainWeather.sunrise![i24],
timeNight: mainWeather.sunset![i24],
),
),
);
},
2023-09-29 15:45:50 +03:00
),
),
2024-01-05 18:55:14 +03:00
),
),
2025-03-15 23:40:48 +03:00
SunsetSunrise(timeSunrise: sunrise, timeSunset: sunset),
2024-01-05 18:55:14 +03:00
DescContainer(
humidity: mainWeather.relativehumidity2M?[hourOfDay],
wind: mainWeather.windspeed10M?[hourOfDay],
visibility: mainWeather.visibility?[hourOfDay],
feels: mainWeather.apparentTemperature?[hourOfDay],
evaporation: mainWeather.evapotranspiration?[hourOfDay],
precipitation: mainWeather.precipitation?[hourOfDay],
direction: mainWeather.winddirection10M?[hourOfDay],
pressure: mainWeather.surfacePressure?[hourOfDay],
rain: mainWeather.rain?[hourOfDay],
cloudcover: mainWeather.cloudcover?[hourOfDay],
windgusts: mainWeather.windgusts10M?[hourOfDay],
uvIndex: mainWeather.uvIndex?[hourOfDay],
dewpoint2M: mainWeather.dewpoint2M?[hourOfDay],
precipitationProbability:
mainWeather.precipitationProbability?[hourOfDay],
shortwaveRadiation: mainWeather.shortwaveRadiation?[hourOfDay],
2024-06-23 23:23:43 +03:00
initiallyExpanded: false,
title: 'hourlyVariables'.tr,
2024-01-05 18:55:14 +03:00
),
2024-09-06 22:07:50 +03:00
DailyContainer(
2024-01-05 18:55:14 +03:00
weatherData: weatherCard,
2025-03-15 23:40:48 +03:00
onTap:
() => Get.to(
() => DailyCardList(weatherData: weatherCard),
transition: Transition.downToUp,
),
),
2024-01-05 18:55:14 +03:00
],
);
}),
2023-06-17 20:57:57 +03:00
),
);
}
}