如何根据天气情况显示图标。我完成了大部分代码,在结尾部分需要帮助
How to show an Icon based on Weather Conditions. I did most of the code, need help in the concluding part
我正在编写一个应用程序,它应该能够根据天气状况在主屏幕上显示一个图标。我正在使用 weather package, geolocator 包和 OpenWeatherMap API。
我能够获得用户的纬度和经度,我也能够获得他所在位置的天气状况,但我目前被困住了,因为我找不到根据天气状况更改图标的正确方法。
这就是我的想法。询问天气情况时的天气包 returns 一个像“clear sky”这样的字符串。现在,因为我想显示 Material 图标中的图标。我正在使用 IconData 构造函数。
Icon(IconData(FUNCTION-RETURNING-INT-NUMBER, fontFamily: 'MaterialIcons',)),
其中 FUNCTION-RETURNING-INT-CODE 是一个函数,returns 一个 int 数字,例如晴天时为“59097”。您可以轻松检查 59097 是 wb_sunny 图标 here
我的想法是编写一个函数,根据天气情况,returns 一个与适当图标对应的 int 数字。这应该可以通过开关盒轻松实现。
不幸的是,我是 OOP 和异步函数的新手,所以我不知道该怎么做。
这是打印天气状况的代码。
void checkMeteo() async {
WeatherFactory wf = new WeatherFactory(
"API KEY",
language: Language.ENGLISH);
late Position position;
position = await determinePosition();
Weather weatherWidget = await wf.currentWeatherByLocation(
position.latitude, position.longitude);
String weatherDescription = weatherWidget.weatherDescription!;
print("Weather Description: $weatherDescription");
}
我确信用这样的开关盒替换最后一个打印就足够了:
switch (weatherDescription) {
case 'clear sky':
return 59097;
break;
case 'rain':
// return rain icon;
// break;
default:
// blabla
}
事实是,如前所述,如果我将函数的类型更改为 int
,我不能,因为 flutter 希望异步函数成为 returns 一个 Future。但即使将 Future<int>
作为类型,IconData 构造函数也不接受它,因为它是 Future<Int>
并且它只接受 int
.
有人可以帮我吗?
您必须将 checkMeteo 方法声明为 Future,因为它必须等待请求。
Future<int> checkMeteo() async {
WeatherFactory wf = new WeatherFactory("API KEY",language: Language.ENGLISH);
late Position position;
position = await determinePosition();
Weather weatherWidget = await wf.currentWeatherByLocation(position.latitude,position.longitude);
String weatherDescription = weatherWidget.weatherDescription!;
switch (weatherDescription) {
case 'clear sky':
return 59097;
break;
case 'rain':
// return rain icon;
// break;
default:
// blabla
}
}
然后等待这个函数,然后把它交给IconData:
final int weatherNumber = await checkMeteo();
Icon(IconData(weatherNumber, fontFamily: 'MaterialIcons',)),
编辑1:在StatefulWidget中使用
int? weatherNumber = null;
Future<void> checkMeteo() async {
WeatherFactory wf = new WeatherFactory("API KEY",language: Language.ENGLISH);
late Position position;
position = await determinePosition();
Weather weatherWidget = await wf.currentWeatherByLocation(position.latitude,position.longitude);
String weatherDescription = weatherWidget.weatherDescription!;
switch (weatherDescription) {
case 'clear sky':
weatherNumber = 59097;
break;
case 'rain':
weatherNumber = 59098;
// break;
default:
/
}
if(mounted) setState(() {})
}
initState(){
super.initState();
checkMeteo();
}
在小部件中:
weatherNumber == null
? CircularProgressIndicator()
: Icon(IconData(weatherNumber, fontFamily: 'MaterialIcons',)),
我正在编写一个应用程序,它应该能够根据天气状况在主屏幕上显示一个图标。我正在使用 weather package, geolocator 包和 OpenWeatherMap API。 我能够获得用户的纬度和经度,我也能够获得他所在位置的天气状况,但我目前被困住了,因为我找不到根据天气状况更改图标的正确方法。
这就是我的想法。询问天气情况时的天气包 returns 一个像“clear sky”这样的字符串。现在,因为我想显示 Material 图标中的图标。我正在使用 IconData 构造函数。
Icon(IconData(FUNCTION-RETURNING-INT-NUMBER, fontFamily: 'MaterialIcons',)),
其中 FUNCTION-RETURNING-INT-CODE 是一个函数,returns 一个 int 数字,例如晴天时为“59097”。您可以轻松检查 59097 是 wb_sunny 图标 here
我的想法是编写一个函数,根据天气情况,returns 一个与适当图标对应的 int 数字。这应该可以通过开关盒轻松实现。
不幸的是,我是 OOP 和异步函数的新手,所以我不知道该怎么做。 这是打印天气状况的代码。
void checkMeteo() async {
WeatherFactory wf = new WeatherFactory(
"API KEY",
language: Language.ENGLISH);
late Position position;
position = await determinePosition();
Weather weatherWidget = await wf.currentWeatherByLocation(
position.latitude, position.longitude);
String weatherDescription = weatherWidget.weatherDescription!;
print("Weather Description: $weatherDescription");
}
我确信用这样的开关盒替换最后一个打印就足够了:
switch (weatherDescription) {
case 'clear sky':
return 59097;
break;
case 'rain':
// return rain icon;
// break;
default:
// blabla
}
事实是,如前所述,如果我将函数的类型更改为 int
,我不能,因为 flutter 希望异步函数成为 returns 一个 Future。但即使将 Future<int>
作为类型,IconData 构造函数也不接受它,因为它是 Future<Int>
并且它只接受 int
.
有人可以帮我吗?
您必须将 checkMeteo 方法声明为 Future,因为它必须等待请求。
Future<int> checkMeteo() async {
WeatherFactory wf = new WeatherFactory("API KEY",language: Language.ENGLISH);
late Position position;
position = await determinePosition();
Weather weatherWidget = await wf.currentWeatherByLocation(position.latitude,position.longitude);
String weatherDescription = weatherWidget.weatherDescription!;
switch (weatherDescription) {
case 'clear sky':
return 59097;
break;
case 'rain':
// return rain icon;
// break;
default:
// blabla
}
}
然后等待这个函数,然后把它交给IconData:
final int weatherNumber = await checkMeteo();
Icon(IconData(weatherNumber, fontFamily: 'MaterialIcons',)),
编辑1:在StatefulWidget中使用
int? weatherNumber = null;
Future<void> checkMeteo() async {
WeatherFactory wf = new WeatherFactory("API KEY",language: Language.ENGLISH);
late Position position;
position = await determinePosition();
Weather weatherWidget = await wf.currentWeatherByLocation(position.latitude,position.longitude);
String weatherDescription = weatherWidget.weatherDescription!;
switch (weatherDescription) {
case 'clear sky':
weatherNumber = 59097;
break;
case 'rain':
weatherNumber = 59098;
// break;
default:
/
}
if(mounted) setState(() {})
}
initState(){
super.initState();
checkMeteo();
}
在小部件中:
weatherNumber == null
? CircularProgressIndicator()
: Icon(IconData(weatherNumber, fontFamily: 'MaterialIcons',)),