- 新增一个城市选择的页面
- 在城市选择页面,点击城市,跳转到对应城市天气的页面
1. 创建城市选择页面
在Android中新建一个页面,需要用Activity,在iOS中需要用ViewController,但在Flutter中,新建一个页面只需要用Widge就行,所以我们新建一个CityWidget.dart
,CityWidget
是一个ListView,从服务器拉取城市的列表并显示,我们用CityData.dart
来存储城市的数据。代码如下:
- CityData.dart
class CityData{
String cityName;
CityData(this.cityName);
}
- CityWidget.dart
CityWidget是一个StatefulWidget,因为CityWidget里的数据是从服务器上拉的,是变的,所以需要用StatefulWidget来实现,从服务器拉取数据的代码和[Flutter实战1 写一个天气查询的APP])里的WeatherWidget
一样,不同的是:
- CityWidget是一个List,用
ListView.builder
实现,需要填两个参数itemCount
(List数据的个数)和itemBuilder
(List中item的view),在itemBuilder
中有index
的参数,可以直接从data中去到数据 - 为了让List的item响应点击事件,在List的item外面包了一层
GestureDetector
,GestureDetector
也是一个Widget,因为在Flutter里处理点击事件的也是一个Widget,所以你想让你的Widget处理事件,必须得包一层处理事件的Widget,在Widget里的onTap
处理点击事件
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:gdg_weather/page/city/CityData.dart';
import 'package:gdg_weather/page/weather/WeatherWidget.dart';
import 'package:http/http.dart' as http;
class CityWidget extends StatefulWidget{
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return CityState();
}
}
class CityState extends State<CityWidget>{
List<CityData> cityList = new List<CityData>();
CityState(){
_getCityList();
}
void _getCityList() async{
List<CityData> citys = await _fetchCityList();
setState(() {
cityList = citys;
});
}
//拉取城市列表
Future<List<CityData>> _fetchCityList() async{
final response = await http.get('https://search.heweather.net/top?group=cn&key=ebb698e9bb6844199e6fd23cbb9a77c5');
List<CityData> cityList = new List<CityData>();
if(response.statusCode == 200){
//解析数据
Map<String,dynamic> result = json.decode(response.body);
for(dynamic data in result['HeWeather6'][0]['basic']){
CityData cityData = CityData(data['location']);
cityList.add(cityData);
}
return cityList;
}else{
return cityList;
}
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return ListView.builder(
itemCount: cityList.length,
itemBuilder: (context,index){
return ListTile(
title: GestureDetector(
child: Text(cityList[index].cityName),
onTap:(){
Navigator.push(
context,
MaterialPageRoute(builder: (context) => WeatherWidget(cityList[index].cityName))
);
},
),
);
});
}
}
2.路由
要打开一个页面,Android中是先初始化Intent
,然后调用startActivity()
;在iOS中是先初始化ViewController
,然后调用pushViewController
;在web里,是调用一个跳转链接。
那么在Dart中如何从一个页面跳转到另一个页面呢?
答案就是 路由
!
最后
最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2020-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。
还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》
一起互勉~
482/android_p7)**
[外链图片转存中…(img-vuDj0sF2-1630844834438)]
[外链图片转存中…(img-Lws54eNs-1630844834440)]
一起互勉~