Files
tuiche/lib/controller/weather/weather_controller.dart
2025-05-23 14:51:09 +08:00

368 lines
13 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// import 'dart:async';
// import 'package:EasyDartModule/EasyDartModule.dart';
// import 'package:ef/ef.dart';
// import 'package:geocoding/geocoding.dart';
// import 'package:geolocator/geolocator.dart';
// import 'package:json_annotation/json_annotation.dart';
// import 'package:vbvs_app/common/util/CommonVariables.dart';
// import 'package:vbvs_app/common/util/MyUtils.dart';
// import 'package:vbvs_app/controller/setting/language/language_controller.dart';
// import 'package:weather/weather.dart';
// part 'weather_controller.g.dart';
// @JsonSerializable()
// class WeatherModel {
// double? longitude; //经度
// double? latitude; //纬度
// String? weather_info = ''; //天气
// int? current_temperature; //温度
// int? min_temperature; //温度
// int? max_temperature; //温度
// String? wind_direction; //风向
// int? wind_speed; //风速等级
// String? cityName; // 新增城市名字段
// String? weatherIcon; // 新增天气图标字段
// String? weatherIconurl; // 新增天气图标字段
// WeatherModel();
// static WeatherModel fromJson(Map<String, dynamic> json) =>
// _$WeatherModelFromJson(json);
// Map<String, dynamic> toJson() => _$WeatherModelToJson(this);
// }
// class WeatherModelController extends GetControllerEx<WeatherModel> {
// LanguageController languageController = Get.find();
// WeatherModelController() {
// attr = GetModel(WeatherModel()).obs;
// weatherFactory = WeatherFactory(CommonVariables.weather_apiKey,
// language: Language.CHINESE_SIMPLIFIED);
// }
// Timer? _timer;
// late WeatherFactory weatherFactory;
// @override
// Future<void> onInit() async {
// super.onInit();
// await _getCurrentLocationAndWeather();
// // 启动定时器每5秒执行一次 getCurrentWeather 方法
// _timer = Timer.periodic(Duration(seconds: 5), (timer) {
// _getCurrentLocationAndWeather();
// });
// }
// @override
// void onClose() {
// // 取消定时器
// _timer?.cancel();
// super.onClose();
// }
// Future<void> _getCurrentLocationAndWeather() async {
// try {
// Position position = await _determinePosition();
// String? language = "zh_CN";
// if (languageController.selectLanguage != null) {
// language = languageController.selectLanguage.value!.language_code;
// }
// List<Placemark> placemarks = await placemarkFromCoordinates(
// position.latitude, position.longitude,
// localeIdentifier: "${language}");
// if (placemarks.isNotEmpty) {
// model.cityName = placemarks[0].locality ?? "未知数据".tr;
// }
// getCurrentWeather(position.latitude, position.longitude);
// } catch (e) {
// print(e);
// EasyDartModule.logger.error("获取位置和天气失败: $e");
// }
// }
// Future<Position> _determinePosition() async {
// bool serviceEnabled;
// LocationPermission permission;
// // 检查位置服务是否启用
// serviceEnabled = await Geolocator.isLocationServiceEnabled();
// if (!serviceEnabled) {
// // 位置服务未启用,返回默认位置
// return Future.error('Location services are disabled.');
// }
// permission = await Geolocator.checkPermission();
// if (permission == LocationPermission.denied) {
// permission = await Geolocator.requestPermission();
// if (permission == LocationPermission.denied) {
// // 权限被拒绝,返回默认位置
// return Future.error('Location permissions are denied');
// }
// }
// if (permission == LocationPermission.deniedForever) {
// // 权限被永久拒绝,返回默认位置
// return Future.error(
// 'Location permissions are permanently denied, we cannot request permissions.');
// }
// // 获取当前位置
// return await Geolocator.getCurrentPosition();
// }
// Future<Weather> getCurrentWeather(
// double latitude,
// double longitude,
// ) async {
// try {
// weatherFactory.language = Language.CHINESE_SIMPLIFIED;
// String? language = "zh_CN";
// if (languageController.selectLanguage != null) {
// language = languageController.selectLanguage.value!.language_code;
// }
// if (language == "zh_CN") {
// weatherFactory.language = Language.CHINESE_SIMPLIFIED;
// } else {
// weatherFactory.language = Language.ENGLISH;
// }
// Weather weather =
// await weatherFactory.currentWeatherByLocation(latitude, longitude);
// model.weather_info = weather.weatherDescription;
// model.min_temperature = weather.tempMin?.celsius?.toInt();
// model.max_temperature = weather.tempMax?.celsius?.toInt();
// model.current_temperature = weather.temperature?.celsius?.toInt();
// model.wind_speed = weather.windSpeed?.toInt();
// model.weatherIcon = weather.weatherIcon;
// if (model.weatherIcon != null) {
// model.weatherIconurl =
// "https://openweathermap.org/img/w/${model.weatherIcon}.png";
// }
// // model.wind_direction = getDirectionByDegree(weather.windDegree);
// updateAll();
// return weather;
// } catch (e) {
// print('Error: $e');
// rethrow;
// }
// }
// Future<List<Weather>> getWeatherForecast(
// double latitude, double longitude) async {
// try {
// return await weatherFactory.fiveDayForecastByLocation(
// latitude, longitude);
// } catch (e) {
// print('Error: $e');
// rethrow;
// }
// }
// String? getDirectionByDegree(double? windDegree) {
// if (windDegree == null) return null;
// if (windDegree >= 337.5 || windDegree < 22.5) {
// return '主页.天气.方向.北'.tr + '主页.天气.方向.单位'.tr;
// } else if (windDegree >= 22.5 && windDegree < 67.5) {
// return '主页.天气.方向.东北'.tr + '主页.天气.方向.单位'.tr;
// } else if (windDegree >= 67.5 && windDegree < 112.5) {
// return '主页.天气.方向.东'.tr + '主页.天气.方向.单位'.tr;
// } else if (windDegree >= 112.5 && windDegree < 157.5) {
// return '主页.天气.方向.东南'.tr + '主页.天气.方向.单位'.tr;
// } else if (windDegree >= 157.5 && windDegree < 202.5) {
// return '主页.天气.方向.南'.tr + '主页.天气.方向.单位'.tr;
// } else if (windDegree >= 202.5 && windDegree < 247.5) {
// return '主页.天气.方向.西南'.tr + '主页.天气.方向.单位'.tr;
// } else if (windDegree >= 247.5 && windDegree < 292.5) {
// return '主页.天气.方向.西'.tr + '主页.天气.方向.单位'.tr;
// } else if (windDegree >= 292.5 && windDegree < 337.5) {
// return '主页.天气.方向.西北'.tr + '主页.天气.方向.单位'.tr;
// } else {
// return null;
// }
// }
// }
import 'dart:async';
import 'package:EasyDartModule/EasyDartModule.dart';
import 'package:ef/ef.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/util/CommonVariables.dart';
import 'package:vbvs_app/controller/setting/language/language_controller.dart';
import 'package:weather/weather.dart';
part 'weather_controller.g.dart';
@JsonSerializable()
class WeatherModel {
double? longitude; // 经度
double? latitude; // 纬度
String? weather_info = ''; // 天气
int? current_temperature; // 温度
int? min_temperature; // 最低温度
int? max_temperature; // 最高温度
String? wind_direction; // 风向
int? wind_speed; // 风速等级
String? cityName; // 城市名
String? weatherIcon; // 天气图标
String? weatherIconurl; // 天气图标url
WeatherModel();
static WeatherModel fromJson(Map<String, dynamic> json) =>
_$WeatherModelFromJson(json);
Map<String, dynamic> toJson() => _$WeatherModelToJson(this);
}
class WeatherModelController extends GetControllerEx<WeatherModel> {
LanguageController languageController = Get.find();
WeatherModelController() {
attr = GetModel(WeatherModel()).obs;
weatherFactory = WeatherFactory(CommonVariables.weather_apiKey,
language: Language.CHINESE_SIMPLIFIED);
}
Timer? _weatherTimer;
Timer? _locationTimer;
late WeatherFactory weatherFactory;
@override
Future<void> onInit() async {
super.onInit();
await _getCurrentLocation();
_weatherTimer = Timer.periodic(Duration(seconds: 5), (timer) {
_getCurrentWeather(); // 每 5 秒更新一次天气
});
_locationTimer = Timer.periodic(Duration(minutes: 10), (timer) {
_getCurrentLocation(); // 每 10 分钟更新一次位置
});
}
@override
void onClose() {
_weatherTimer?.cancel(); // 取消天气更新定时器
_locationTimer?.cancel(); // 取消位置更新定时器
super.onClose();
}
// 获取当前位置并存储到 model
Future<void> _getCurrentLocation() async {
try {
Position position = await _determinePosition();
String? language = "zh_CN";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
List<Placemark> placemarks = await placemarkFromCoordinates(
position.latitude, position.longitude,
localeIdentifier: language);
if (placemarks.isNotEmpty) {
model.cityName = placemarks[0].locality ?? "未知数据".tr;
model.latitude = position.latitude;
model.longitude = position.longitude;
}
// 调用获取天气方法
_getCurrentWeather();
} catch (e) {
print(e);
EasyDartModule.logger.error("获取位置失败: $e");
}
}
// 获取当前位置
Future<Position> _determinePosition() async {
bool serviceEnabled;
LocationPermission permission;
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
return Future.error('位置服务未启用');
}
permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
return Future.error('位置权限被拒绝');
}
}
if (permission == LocationPermission.deniedForever) {
return Future.error('位置权限被永久拒绝');
}
return await Geolocator.getCurrentPosition();
}
// 获取天气信息
Future<void> _getCurrentWeather() async {
if (model.latitude == null || model.longitude == null) {
EasyDartModule.logger.error("获取天气失败:位置数据获取失败");
return; // 如果位置数据没有获取到,则不更新天气
}
String? language = "zh_CN";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
List<Placemark> placemarks = await placemarkFromCoordinates(
model.latitude!, model.longitude!,
localeIdentifier: language);
if (placemarks.isNotEmpty) {
model.cityName = placemarks[0].locality ?? "未知数据".tr;
}
try {
weatherFactory.language = Language.CHINESE_SIMPLIFIED;
String? language = "zh_CN";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
if (language == "zh_CN") {
weatherFactory.language = Language.CHINESE_SIMPLIFIED;
} else {
weatherFactory.language = Language.ENGLISH;
}
Weather weather = await weatherFactory.currentWeatherByLocation(
model.latitude!, model.longitude!);
model.weather_info = weather.weatherDescription;
model.min_temperature = weather.tempMin?.celsius?.toInt();
model.max_temperature = weather.tempMax?.celsius?.toInt();
model.current_temperature = weather.temperature?.celsius?.toInt();
model.wind_speed = weather.windSpeed?.toInt();
model.weatherIcon = weather.weatherIcon;
if (model.weatherIcon != null) {
model.weatherIconurl =
"https://openweathermap.org/img/w/${model.weatherIcon}.png";
}
updateAll(); // 更新 UI
} catch (e) {
EasyDartModule.logger.error("获取天气失败: $e");
print('获取天气失败: $e');
}
}
// 获取 5 天天气预报
Future<List<Weather>> getWeatherForecast(
double latitude, double longitude) async {
try {
return await weatherFactory.fiveDayForecastByLocation(
latitude, longitude);
} catch (e) {
print('获取天气预报失败: $e');
rethrow;
}
}
}