开源一个Flutter版WanAndroid客户端

1. 前言

项目地址: https://github.com/xfhy/WanAndroid-Flutter

前段时间抽了点业余时间学了点Flutter入门,打算写个简单项目练练手.说实话,只有真正动手写东西才能真正切身感受到Flutter的魅力,刚开始学的时候写布局特别难受,各种嵌套,很烦. 后面多写一点儿之后感觉也还是勉强可以接受,各种Widget操作起来也还是容易.

Flutter目前我认为是最合理的跨平台方案,只需要native提供画布,Flutter直接自己在上面画Widget,就单凭这一点就和RN截然不同.RN还需要JS和Java进行中转,多了一层,肯定会慢很多,而且还不能自己画.

再来说说开发和发布,支持JIT和AOT.平时开发使用JIT,可以快速热加载,及时将代码变动传递给flutter app,这其实可以大大提升开发效率.及时查看UI和逻辑是否正确,不像原生开发还需要重新编译,花费很多时间.然后Flutter在发布(release包)的时候,采用AOT,运行时直接指向Native(arm)代码,高效.

可能有时候Flutter需要和native通信,比如使用相机之类的,这时会使用到channel技术,但是这个是C++层次的,性能好.

所以,了解一下Flutter.

2. 下载试玩

扫描二维码下载


image

3. 技术点

  • 封装 上拉加载,下拉刷新
  • dio进行网络请求,统一封装get,post
  • 封装banner
  • Future
  • 路由,跳转界面
  • 事件总线 event_bus
  • toast
  • SharedPreference
  • ....

4. 项目截图

5. 遇到的问题

5.1 引入第三方库

  1. 首先去官网package搜索.
  2. 找到相应插件,点进详情,切换到Installing tab,然后在pubspec.yaml中引入该插件.
  3. 在本项目控制台,输入flutter pub get. 即引入三方库完成.

5.2 loading

当页面正在loading时,需要一个Widget来占位,不然Widget为空要报错.

5.3 运行在iOS上

  1. 首先得安装Xcode(7.8G)
  2. 然后安装 cocoapods sudo gem install cocoapods
  3. 然后在ios工程下,执行pod install,引入那些依赖
  4. 然后用AS打开ios项目里面的Info.plist,点击右上角的用Xcode打开.
  5. 编辑Podfile,将顶部的platform :ios, '9.0' 注释放开
  6. 运行到模拟器上.

5.4 如何快速解析json

Flutter不支持运行时反射,所以没有像Gson这样自动解析JSON的库来降低解析成本.在Flutter中解析JSON需要完全手动进行操作,麻烦.

可以在AS上装FlutterJsonBeanFactory这个插件,然后右键New->JsonToDartBeanAction,输入文件名和json数据.即可自动生成bean对象,和它所对应的解析代码.

原理是它生成了一个JsonConvert,然后这里面可以根据运行时type去选择应该解析哪一个类对象.
然后bean类在声明的时候是混入了JsonConvert的,可以直接使用JsonConvert里面的方法,完美.

5.5 Flutter ScrollView (滚动视图)

ScrollView是一个带有滚动的视图组件,它本身由三部分组成

  • Scrollable - 它监听各种用户手势并实现滚动的交互设计。
  • Viewport - 它通过在滚动视图内仅显示一部分小部件来实现滚动的可视化设计。
  • Slider - 它们是可以组合以创建各种滚动效果的小部件,如列表,网格和扩展标题。

Scroll是一个抽象类,通常使用CustomScrollView

CustomScrollView(
    shrinkWrap: true,
    // 内容
    slivers: <Widget>[
        new SliverPadding(
            padding: const EdgeInsets.all(20.0),
            sliver: new SliverList(
                delegate: new SliverChildListDelegate(
                    <Widget>[
                        const Text('A'),
                        const Text('B'),
                        const Text('C'),
                        const Text('D'),
                    ],
                ),
            ),
        ),
    ],
)

5.6 处理Text超出问题

可以放Row或Column中,用Expanded包起来,然后用maxLines控制行数,用overflow: TextOverflow.ellipsis,控制超出部分的展示.

5.7 让一个ListView支持下拉刷新

非常简单,
使用官方自带的RefreshIndicator即可,将listview放child,然后实现一个_pullToRefresh下拉刷新时调用的方法(做下拉刷新的逻辑).

RefreshIndicator(
      child: listView,
      onRefresh: _pullToRefresh,
    );

Future<void> _pullToRefresh() {
    loadData();
    //这里Feature不能返回 null
    return Future(() => LogUtil.d("lalala"));
  }

5.8 获取屏幕宽度,高度

MediaQuery.of(context).size.width,
MediaQuery.of(context).size.height

5.9 封装通用标题栏

标题栏,每个界面都需要,所以封装一个,取需.

///get通用状态栏
static AppBar getCommonAppBar(BuildContext context, String title, {double fontSize, List<Widget> actions}) {
if (title == null) {
  title = "";
}
return AppBar(
  leading: IconButton(
    icon: Icon(
      Icons.arrow_back,
      color: Colors.white,
    ),
    //点击返回
    onPressed: () {
      if (context != null) {
        Navigator.pop(context);
      }
    },
  ),
  title: Text(
    title,
    style: TextStyle(
      color: Colors.white,
      fontSize: fontSize == null ? 18.0 : fontSize,
    ),
  ),
  //标题栏居中
  centerTitle: true,
  //右边的action 按钮
  actions: actions == null ? <Widget>[] : actions,
);
}

5.10 格式化String

dart中格式化String,需要引入三方库sprintf,使用方式如下:

sprintf("lg/collect/%s/json", [15615]);

5.11 获取Android/iOS本地目录

需要引入三方库path_provider,用于查找文件系统上的常用位置,支持Android和iOS.免得去写一原生代码,这个三方库帮我们封装好了.

Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;

Directory appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;

5.12 展示一个Dialog

以下方法是dart的material包下面的方法.

//展示对话框
showDialog(
        context: context,
        barrierDismissible: false,
        builder: (_) {
          return SpinKitFadingCircle(
            color: AppColors.colorPrimary,
          );
        });

//取消对话框
Navigator.of(context).pop();

5.13 间距的简单方式

可以用Padding和margin来实现.其实还有一种方式,可以在Column和Row中快速增加一段间距,利用SizedBox,类似Android中的Space

SizedBox(width: 10.0),

5.14 收起软键盘

有时候需要在点击某些按钮时收起软键盘

FocusScope.of(context).requestFocus(FocusNode());

5.15 让ListView的item点击时有水波纹效果

用InkWell把Item包起来

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

推荐阅读更多精彩内容

  • 胡常洲50多岁炼厂人
    李曼瑛一家庭教育阅读 110评论 0 0
  • 发现现在自己读的书真的太少了,所以很多时候开头都想用时间过得真快,时间飞逝这么两句。 但是白驹过隙,弹指一挥间却很...
    march_elle阅读 178评论 0 0
  • 三月有你 四月有你 五月你走了 六月是他自己 七月八月是雨季 九月十月连泡沫里带着香气 冬月煮酒腊月烧起了肉 一月...
    Fanderix阅读 186评论 0 0
  • 月近中秋好时节, 人将古稀心意惬。 喜看新种麦苗绿, 哪管衰草与黄叶。 秦时明月今秋夜, 仰首向天思明月。 明月阅...
    沧海桑田_7c8e阅读 157评论 0 0
  • 感觉时间又过了很长时间了啊 今天阴历六月六 挺好 今天来细数一下陪我每个年龄段的小说 启蒙阶段 灌篮高手 龙珠 名...
    阿卡贝拉的调调阅读 202评论 0 1