项目起因
本人租房在融泽嘉园,每天去上地上班,日常交通路线是乘坐963到软件园广场,再转447/446/982/365到上地七街,但有好几次等963公交就等了30到40分钟(西二旗太堵了),之后我通过“北京公交”微信公众号来查看963到站信息再出门,这样就只需计算好时间出门,每次都能恰好赶上。
然而,恕我直言,通过微信公众号查询的步骤太繁琐了:
打开微信 ->搜索北京公众号-> 点击实时查询公交菜单 -> 选择公交路线-> 选择方向 ->选择当前站点 -> 查询
操作貌似不是很复杂呀,额,我有个偏执的观点,玩游戏选区时,我都尽量往靠前的区选,这样以后领取奖励的时候不用滑太久,不然->_->
所以,为了化解我心中的偏执,我打算写一个App,简化查询实时公交到站信息的流程,本来打算用Android写的,但Google推出的Flutter移动UI框架有一段时间了,作为一个移动开发从业者,不尝试一下貌似有点不太给面子。膜拜了下Flutter Live里展示的几个有意思的demo,就开始学习Dart语法了。
开启准备
前期工作主要分为两部分,一是接口数据抓取,分析,处理,二是Flutter环境搭建,学习Dart语法规范,Flutter组件使用。
数据处理
打开,打开浏览器“检查”,通过操作实时公交查询,分析发出的请求和请求结果,最后提取出所需要的几个接口
获取北京所有公交路线
http://www.bjbus.com/home/index.php
根据所选路线获取该路线的路线方向
根据所选路线,路线的方向,获取该路线上的所有站点列表
根据所选路线,路线方向,当前站点获取该路线上的公交到站信息
http://www.bjbus.com/home/ajax_rtbus_data.php?act=busTime&selBLine=10&selBDir=5582831127904445311&selBStop=3
接下来就是对上述结果进行html解析,json解析了,具体可查看项目源码。
Flutter学习
入坑开发
Flutter异步
Dart是一个单线程的语言,Dart中实现异步的方式是:当遇到有需要延迟的运算(async)时,将其放入到延迟运算的消息队列(await)中去,把不需要延迟运算的部分先执行掉,最后再来处理延迟运算的部分。
Dart的命令行应用可以通过创建isolates来达到并行运行,但isolates之间不会共享内存,它们就像几个运行在不同进程中的app,通过传递message来进行交流。除非明确指出运行在额外的isolates或者workers中的代码,所有的应用代码都是运行在应用的main isolate中
一个Dart应用开始的标志是它的main isolate执行了main方法。当main方法退出后,main isolate的线程就会去逐一处理消息队列中的消息,消息队列有两种:
- Event队列
包括I/O,mouse events,drawing events,timers,isolate之间的message等。可以通过new Future
或者new Future.delayed()
来向event队列中添加事件
- Microtask队列
只包含来自当前isolate的内部代码,用scheduleMicrotask()方法添加
最后代码执行顺序为,main方法代码-> Microtask队列 ->Event队列,所有消息队列里的事件执行按照先进先出原则顺序,
Flutter控件
在Flutter但世界里,一切都是Weight,,不管是输入框,图片,还是布局容器,甚至居中,内边距,外边距,都是Weight,这些Weight相互嵌套构成完整的界面,因此需要运用设计模式编写优雅的代码。Flutter自带了十分丰富等控件,虽然也存在一些不足,但随着Flutter社区不断壮大,相信日后必将逐渐完善,本次项目使用了不少组件,如SimpleDialog,ListView,Stepper
Flutter动画
Flutter动画在本次项目中主要有三种
- 闪屏界面的应用图标放大动画,采用Animation和AnimationController控制
- 页面切换动画,通过自定义Route实现
- Flare动画,参考,在网站上有许多Demo
启动页面和闪屏页面
App每次刚开始启动由于应用需要初始化资源,往往有一段白屏,显示白屏是由于Android默认给启动时的界面设置了一个白色背景,我们可以通过自己修改配置来改变启动页背景。
而闪屏页面,即在启动页之后显示,之后需要移除任务栈,具体设置方法可以参考下述文章
项目地址
感兴趣的道友也可以可以下载项目后本地打包