前言
前两篇实现了从实时天气的界面,这次将分享获取城市列表的数据并展示出来。获取数据和刷新的流程跟天气获取展示是一样的,不一样的是通过本文可以认识新的组件ListView。
开始
1.创建城市Widget
class CityWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new CityListState();
}
}
2.创建城市列表
class CityListState extends State<CityWidget> {
@override
Widget build(BuildContext context) {
//列表组件
return ListView.builder(
//有多少个item
itemCount: cityList.length,
itemBuilder: (context, index) {
//每个item显示的内容
return ListTile(
title: Container(
padding: EdgeInsets.all(5),
child: Text(cityList[index].name,
style: TextStyle(color: Colors.white, fontSize:18)),
color: Colors.blue,)
);
});
}
}
3.创建城市实体类
class CityData {
String name;
CityData({this.name});
}
4.添加网络获取数据并刷新
List<CityData> cityList = new List<CityData>();
//创建时开始发起异步请求
CityListState() {
_getCityList();
}
_getCityList() async {
List<CityData> result = await _futureGetCityList();
setState(() {
cityList = result;
});
}
Future<List<CityData>> _futureGetCityList() async {
//TODO:获取城市列表
var url = "https://search.heweather.net";
var httpClient = new HttpClient();
List<CityData> data = new List<CityData>();
try {
var uri = new Uri.http(
url, '/top', {'key': "mykey", 'group': 'cn'});
var request = await httpClient.getUrl(uri);
var response = await request.close();
if (response.statusCode == HttpStatus.OK) {
var responseBody = await response.transform(Utf8Decoder()).join();
var cityJson = await json.decode(responseBody);
for (dynamic city in cityJson['HeWeather6'][0]['basic']) {
CityData cityData = CityData(name: city['location']);
data.add(cityData);
}
}
} catch (exception) {
print(exception.toString());
}
return data;
}
5.修改首页
在WeatherApp中的build方法作显示Widget的修改:
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Weather App',
// home: WeatherWidget(),
home: Scaffold(
body: CityWidget(),
),
theme: ThemeData(
primarySwatch: Colors.blue,
),
);
}
这样便可以显示一个城市列表。
结语
通过以上步骤便可以获取城市列表并展示,虽然界面不美观,但已达到我们的目的了。