Я хочу выполнить сетевой запрос (Rest API) к OpenWeatherMap-API после того, как я нажму кнопку в моем самом первом приложении. В основном, я следую этому уроку: Извлечение данных из интернета
Поэтому я создал вызов API, который следует учебнику и работает как чудо:
class OpenWeatherApi {
static const _API_KEY = "asdbaklsadfkasdlfkasdjfl";
Future<CurrentWeather> getCurrentWeather(String location) async {
final url =
"https://api.openweathermap.org/data/2.5/weather?q=$location&APPID=$_API_KEY";
final response = await get(url);
final responseJson = json.decode(response.body);
return new CurrentWeather.fromJson(responseJson);
}
}
Я вызываю API в своем виджете с отслеживанием состояния:
class _MyHomePageState extends State<MyHomePage> {
String _currentWeather = "";
void _callWeatherApi() {
var api = new OpenWeatherApi();
api.getCurrentWeather("Waldershof, Germany").then((weather) {
setState(() {
_currentWeather = weather.getTextualRepresentation();
});
}, onError: (error) {
setState(() {
_currentWeather = error.toString();
});
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new TextField(
decoration: new InputDecoration(
border: InputBorder.none, hintText: 'Please enter a Location'),
),
new RaisedButton(
onPressed: () {
_callWeatherApi();
},
child: new Text("Get Weather"),
),
new Text(
'$_currentWeather',
style: Theme.of(context).textTheme.display1,
),
],
),
);
}
}
Нажав на RaisedButton
, я вызываю свою функцию _callWeatherApi
. Эта функция выполняет сетевой запрос и впоследствии обновляет мой виджет. В основном это работает очень хорошо.
Но в примере они используют FutureBuilder
-Widget для сетевого запроса, что имеет некоторые приятные преимущества в отношении обработки состояния (например, отображение индикатора прогресса):
new FutureBuilder<Post>(
future: fetchPost(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return new Text(snapshot.data.title);
} else if (snapshot.hasError) {
return new Text("${snapshot.error}");
}
// By default, show a loading spinner
return new CircularProgressIndicator();
},
);
К сожалению, я не знаю, может ли этот виджет FutureBuilder
использоваться с сетевым запросом, который вызывается нажатием кнопки.
Из-за этого я не знаю, является ли моя реализация сетевого запроса, основанного на нажатии кнопки, современной или ее можно улучшить, например, с помощью, например, FutureBuilder
или другой виджет во Флаттере?
У вас есть предложения по улучшению моего кода?