flutter天气预报APP

前言

这是一个使用flutter写的天气预报APP,主要使用了以下几个插件,入门级练练手。
dio:网络请求插件,用于获取天气信息
fluttertoast:弹出toast提示信息
shared_preferences:简单的数据存储,用于保存设置过的天气预报信息
intl:日期格式化
get:状态管理
项目GitHub地址:d9l_weather

界面

首先搜集一些天气预报APP的设计稿,确定一下自己的界面。看到有很多好看的,但是并不想做的太复杂。于是选了个简单的,下面是实现的效果图:


首页图

然后分析一下这个页面,大主体就是一个列布局(Column),中间穿插行布局(Row)。详细的布局这里就不写,可以在这查看源码home_page.dart

界面堆好之后,再做一个搜索城市的页面,一个搜索框加列表就可以了,怎么简单怎么来。页面通过右上角的设置按钮进入。

API接口调用

页面都写好之后就需要把数据替换成真实数据了,这里使用了和风天气的API获取天气数据,注册之后就能使用。但是普通用户有些接口是不能用的,但是对这个APP来说,能够查到天气信息、最近三天和生活指数这些信息就足够了。
要请求接口,这里使用dio插件来实现。使用单例模式即可。
新建一个http.dart文件,简单写一下get和post方法,如下。

import 'package:dio/dio.dart';

class Http {
  static Dio dio;

  factory Http() => _getInstance();
  static Http get instance => _getInstance();
  static Http _instance; // 单例对象

  static Http _getInstance() {
    if (_instance == null) {
      _instance = Http._internal();
    }
    return _instance;
  }

  Http._internal() {
    dio = Dio(BaseOptions(connectTimeout: 60000, receiveTimeout: 15000, sendTimeout: 15000));
    dio.options.baseUrl = rootUrl;
  }

  static final String rootUrl = 'https://free-api.heweather.net/s6';
  static final String key = '在和风天气控制台获取key';

  Future get(String path, Map<String, dynamic> params) async {
    try {
      Response response = await dio.get(path, queryParameters: params);
      return response.data;
    } catch (e) {
      print(e);
      return null;
    }
  }

  Future post(String path, Map<String, dynamic> data) async {
    try {
      Response response = await dio.post(path, data: data);
      return response.data;
    } catch (e) {
      return null;
    }
  }
}

使用方法,传入请求地址和参数即可

Http().get('/weather/now', {
      'location': cid,
      'lang': D9l().lang,
      'key': Http.key,
    });

如获取实时天气的方法如下:

// 实况天气
 Future _getNow() async {
    var result = await Http().get('/weather/now', {
      'location': cid,
      'lang': D9l().lang,
      'key': Http.key,
    });

    if (result != null) {
      status = result['HeWeather6'].first['status'];
      if (status == 'ok') {
        basic = Basic.fromJson(result['HeWeather6'].first['basic']);
        update = Update.fromJson(result['HeWeather6'].first['update']);
        now = Now.fromJson(result['HeWeather6'].first['now']);
      }
    }
  }

shared_preferences

在搜索完一个城市的天气后,需要把这个城市的id保存在shared_preferences中,这样关闭app下次再打开的时候才能显示上一次查询的城市天气,或者需要保存多个城市天气预报的时候,也可以保存。
保存只需要一行代码:

SpClient.sp.setString('cid', cid);

shared_preferences的使用也是使用了单例模式,和http.dart一样

国际化

本项目使用了easy_localization插件来实现,个人觉得这还是一个比较简单好上手的一个插件

runApp(EasyLocalization(child: MyApp()));

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var data = EasyLocalizationProvider.of(context).data;
    return EasyLocalizationProvider(
      data: data,
      child: MaterialApp(
        title: 'd9l weather',
        localizationsDelegates: [
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
          EasylocaLizationDelegate(
            locale: data.locale,
            path: 'assets/langs', // 多语言路径
          ),
        ],
        supportedLocales: [Locale('en', 'US'), Locale('zh', 'CN')],
        locale: data.savedLocale,
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: HomePage(),
      ),
    );
  }
}

然后编写自己的国际json文件,放在assets/langs路径下,并且在pubspec.yaml中进行声明,并在Text组件中这样使用AppLocalizations.of(context).tr('wind'),wind是你在json中使用的key,它会根据当前的语言显示。
切换语言也很简单

var data = EasyLocalizationProvider.of(context).data;
data.changeLocale(Locale("zh", "CN"));

最后

这个项目很简单,也只是用了很少的东西,主要是练练手吧。也没太多东西能够介绍的。后面有时间的话会继续完善。感兴趣的可以关注一下。GitHub给star支持,谢谢!
最后再放一下本项目的GitHub地址 d9l_weather

更新

文章于2020.3.23日晚更新,对界面进行了重新排版,项目整体都做了较大改变,并且新增了国际化、状态管理。继续完善中~

其他项目

flutter版的文件管理器项目地址

flutter入门widget的使用。带你认识flutter widgets。根据flutter中文网widgets目录进行编写的一个库。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351