博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter实战(一)写一个天气查询的APP
阅读量:6824 次
发布时间:2019-06-26

本文共 7291 字,大约阅读时间需要 24 分钟。

先上效果图;

代码github地址:

1.创建工程

在Android Studio中,File -> New ->New Flutter Project -> Flutter Application

创建完工程后,有三个目录

android:Android工程的目录

ios:iOS工程的目录

lib: Flutter工程的目录

其中android、ios下的文件我们都不动,我们只改动lib目录下的dart文件。

2.运行Flutter工程

  1. 连接手机
  • 这里不建议用模拟器,因为模拟器在用GPU渲染时可能会出问题,导致图片渲染不出来。
  1. 然后按Run 在手机上把程序跑起来。

3.天气API接口申请

注册地址

注册完后,再看API文档 

demo这里用的是,获取当天天气情况的API:

用的请求URL如下:

https://free-api.heweather.com/s6/weather/now?location=广州&key=******

4.界面编写

在创建的工程里,有个main.dart里面有一段显示界面的代码如下:

class MyApp extends StatelessWidget {  // This widget is the root of your application.  @override  Widget build(BuildContext context) {    return MaterialApp(      title: 'Flutter Demo',      theme: ThemeData(        // This is the theme of your application.        //        // Try running your application with "flutter run". You'll see the        // application has a blue toolbar. Then, without quitting the app, try        // changing the primarySwatch below to Colors.green and then invoke        // "hot reload" (press "r" in the console where you ran "flutter run",        // or press Run > Flutter Hot Reload in a Flutter IDE). Notice that the        // counter didn't reset back to zero; the application is not restarted.        primarySwatch: Colors.blue,      ),      home: MyHomePage(title: 'Flutter Demo Home Page'),    );  }}

其中home 就是要显示的界面,这里我们要把MyHomePage换成我们自己的。

4.1 创建WeatherWidget

通过 new -> Dart File 在lib目录下创建WeatherWidget

class WeatherWidget extends StatefulWidget{  @override  State
createState() { // TODO: implement createState return new WeatherState(); }}class WeatherState extends State
{ @override Widget build(BuildContext context) { // TODO: implement build return Scaffold( ); } }

创建完后,在main.dart中将home改为WeatherWidget,如下:

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: WeatherWidget(),    );  }

4.2 HotReload

在写UI的工程中,我们可以用到Flutter的hot reload的特性,写布局的时候,按ctrl+scmd+s就可以在手机上实时看到界面的变化。

这个功能很好用。

4.3添加图片资源

Flutter可以添加不同的资源,例如图片、文本、配置文件、静态数据等。

添加资源时,需要在pubspec.yaml文件中的flutter属性下添加assets,并标明要添加资源的路径,例如,我们要加入指定的图片时,可以这么写:

flutter:  assets:    - assets/my_icon.png    - assets/background.png

如果要添加的资源太多,也可以添加文件夹,例如:

flutter:  assets:    - assets/

在本demo中,要添加一个背景图,我们在工程的根目录下创建images目录,将背景图放在images目录下,然后在pubspec.yaml中添加:

flutter:  # The following line ensures that the Material Icons font is  # included with your application, so that you can use the icons in  # the material Icons class.  uses-material-design: true  assets:    - images/

4.4 写WeatherWidget的UI布局

Scaffold中添加body的属性,来写UI的布局,如下:

class WeatherState extends State
{ @override Widget build(BuildContext context) { // TODO: implement build return Scaffold( body: new Stack( fit: StackFit.expand, children:
[ new Image.asset("images/weather_bg.jpg",fit: BoxFit.fitHeight,), new Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children:
[ new Container( width: double.infinity, margin: EdgeInsets.only(top: 40.0), child: new Text( "广州市", textAlign: TextAlign.center, style: new TextStyle( color: Colors.white, fontSize: 30.0, ), ), ), new Container( width: double.infinity, margin: EdgeInsets.only(top: 100.0), child: new Column( children:
[ new Text( "20 °", style: new TextStyle( color: Colors.white, fontSize: 80.0 )), new Text( "晴", style: new TextStyle( color: Colors.white, fontSize: 45.0 )), new Text( "湿度 80%", style: new TextStyle( color: Colors.white, fontSize: 30.0 ), ) ], ), ) ], ) ], ), ); }}

ctrl+s,在手机上就可以看到写好的UI,但这时候的数据是写死的,下来看如何通过http获取数据。

5.通过http获取数据

要通过http数据,我们首先要添加http的依赖库,在pubspec.yaml中的dependencies添加如下:

dependencies:  flutter:    sdk: flutter  # The following adds the Cupertino Icons font to your application.  # Use with the CupertinoIcons class for iOS style icons.  cupertino_icons: ^0.1.2  http: ^0.12.0

然后在当前工程目录下运行以下命令行:

$ flutter packages get

或者在Android Stuido 打开pubspec.yaml 文件,点击上面的packages get

这里操作的意义是,拉取http的库。

5.1 创建WeatherData类

通过 new -> Dart File 在lib目录下创建WeatherData

class WeatherData{  String cond; //天气  String tmp; //温度  String hum; //湿度  WeatherData({this.cond, this.tmp, this.hum});  factory WeatherData.fromJson(Map
json) { return WeatherData( cond: json['HeWeather6'][0]['now']['cond_txt'], tmp: json['HeWeather6'][0]['now']['tmp']+"°", hum: "湿度 "+json['HeWeather6'][0]['now']['hum']+"%", ); } factory WeatherData.empty() { return WeatherData( cond: "", tmp: "", hum: "", ); }}

5.2 数据获取

class WeatherState extends State
{ WeatherData weather = WeatherData.empty(); WeatherState(){ _getWeather(); } void _getWeather() async{ WeatherData data = await _fetchWeather(); setState((){ weather = data; }); } Future
_fetchWeather() async{ final response = await http.get('https://free-api.heweather.com/s6/weather/now?location=广州&key=ebb698e9bb6844199e6fd23cbb9a77c5'); if(response.statusCode == 200){ return WeatherData.fromJson(json.decode(response.body)); }else{ return WeatherData.empty(); } } @override Widget build(BuildContext context) { ... }}

5.3 将之前写死的数据换成WeatherData

...                                child: new Column(                  children: 
[ new Text( weather?.tmp, style: new TextStyle( color: Colors.white, fontSize: 80.0 )), new Text( weather?.cond, style: new TextStyle( color: Colors.white, fontSize: 45.0 )), new Text( weather?.hum, style: new TextStyle( color: Colors.white, fontSize: 30.0 ), ) ], ), ...

至此这款天气查询的APP实现了一个显示城市、温度、天气、湿度的界面,但是这个界面只有一个显示的功能,没有任何可交互的地方,写下篇文章继续完善查询天气的APP的功能。

欢迎加入学习交流群;964557053。进群可免费领取一份最新技术大纲和Android进阶资料。请备注csdn

转载地址:http://sblzl.baihongyu.com/

你可能感兴趣的文章
java自学篇之程序设计基础
查看>>
swiper的基础使用(五)
查看>>
Windows Server 2012R2 Hyper-v之虚拟机复制(2)
查看>>
大数据各种实用网站
查看>>
win7安装laravel
查看>>
Oracle 各后台进程功能说明
查看>>
屏蔽storm ui的kill功能
查看>>
我的友情链接
查看>>
Oracle Decode函数的使用
查看>>
MSF学习笔记
查看>>
经典脚本案例--check memory
查看>>
20.31 expect脚本同步文件;20.32 expect脚本指定host和要同步的文件;20.33 构建文件分发系统;20.34...
查看>>
CentOS单用户与救援模式
查看>>
postfix 源码centos7上搭建及错误提示---亲测
查看>>
【Redis篇】Redis集群安装与初始
查看>>
jquery基础
查看>>
C# 集合已修改;可能无法执行枚举操作
查看>>
FSM Code Generator
查看>>
JDBC学习笔记——事务、存储过程以及批量处理
查看>>
JVM内存结构
查看>>