Flutter實戰(二)寫一個天氣查詢的APP
前面一篇文章[Flutter實戰1 寫一個天氣查詢的APP]實現了一個顯示城市、溫度、天氣、溼度的介面,但是這個介面只有一個顯示的功能,沒有任何可互動的地方,本篇文章繼續完善查詢天氣的APP的功能。
先上效果圖;
增加兩個功能:
- 新增一個城市選擇的頁面
- 在城市選擇頁面,點選城市,跳轉到對應城市天氣的頁面
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中如何從一個頁面跳轉到另一個頁面呢?
答案就是 路由
!
路由有多種實現,這裡給出一個:
- 開啟一個頁面
Navigator.push(
context,
MaterialPageRoute(builder: (context) => WeatherWidget(cityList[index].cityName))
);
- 返回
Navigator.pop(context);
3.WeatheWidget
天氣頁面需要知道上個頁面點選的是哪個城市,所以將城市當做WeaterWidget
的構造引數傳過來。
4.頁面調整
因為我們想第一個開啟的頁面是城市列表,點選城市列表後,跳轉到天氣頁面,所以調整一下main.dart
裡面的程式碼,將WeatherWidget
改為CityWidget
:
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: `Flutter Demo`,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
body: CityWidget(),
),
);
}
}
5.程式碼目錄跳轉
其實到前面一步,功能已經實現,但是因為現在已經有很多類了,現在目錄結構太混亂了,調整一下,如下:
下一篇帶大家一起檢驗跨平臺能力。
歡迎加入學習交流群;964557053。進群可免費領取一份最新技術大綱和Android進階資料。請備註csdn
相關文章
- Flutter實戰(一)寫一個天氣查詢的APPFlutterAPP
- Flutter實戰1 --- 寫一個天氣查詢的APPFlutterAPP
- Flutter實戰2 — 寫一個天氣查詢的APPFlutterAPP
- Flutter實戰2 --- 寫一個天氣查詢的APPFlutterAPP
- Flutter實戰4 -- 天氣查詢APP重構之狀態管理(InheritedWidget)FlutterAPP
- Flutter實戰5 -- 天氣查詢APP重構之狀態管理(ScopedModel)FlutterAPP
- Flutter+Mobx實戰,寫一個App應用FlutterAPP
- [Python實戰]Python製作天氣查詢軟體Python
- python天氣查詢Python
- flutter天氣預報APPFlutterAPP
- 一週時間編寫你的第二個 Flutter APPFlutterAPP
- 天氣預報查詢 API 提供個性化的天氣服務的設計思路API
- Python實現天氣查詢功能(外加Excel技巧)PythonExcel
- 查詢天氣預報網站網站
- springboot應用查詢城市天氣Spring Boot
- 二分查詢 | 二分查詢的一種推薦寫法
- 命令列查詢天氣的正確方式命令列
- 開源一個天氣APP Build with React NativeAPPUIReact Native
- 各種免費好用的api,含天氣查詢、IP查詢、物流查詢等API
- 北京實時公交查詢——Flutter 入坑實戰Flutter
- 寫一個“特殊”的查詢構造器 – (二、第一條語句)
- Flutter實踐:天氣預報Flutter
- vue例項+axios-天氣查詢VueiOS
- Flutter Weather天氣模組實現Flutter
- Flutter混合App實戰FlutterAPP
- 天氣預報查詢 API + AI 等於王炸(一大波天氣預報查詢 API 應用場景更新了)APIAI
- 編寫一個 SQL 查詢來實現分數排名。SQL
- 天氣出行、手機號查詢、簡訊、IP查詢類好用的介面推薦
- React實戰之React+Redux實現一個天氣預報小專案ReactRedux
- 二分查詢(一)——純粹的二分查詢
- Angular+ionic+cordova實現天氣AppAngularAPP
- Flutter 入門與實戰(三十三):手寫一個持久化的 CookieManagerFlutter持久化Cookie
- [譯] 寫一個完整的 Flutter App 是什麼感覺FlutterAPP
- 我用 Flutter Gemini 寫了一個水貼 APPFlutterAPP
- React + Redux + Redux-thunk + Semantic-UI-React 實現一個簡單天氣AppReactReduxUIAPP
- 通過cobra開發天氣查詢小工具
- 這兩天寫的一個二叉平衡樹
- 使用JS去實現一個BST(二叉查詢樹)JS