程序员flutterAndroid开发经验谈

flutter介绍(android开发角度)

2018-11-25  本文已影响19人  Dynamic_2018

前言:很久没更新文章了,做个更新;前段时间,8 9月份在接触ml kit、机器学习、tensorflow相关的(比较耗时间,而且基本上都是皮毛);由于后面一段时间工作上实在是太忙就断掉了;然后这个月有时间开始搞搞flutter,后面倒是想试试tensorflow lite,就是不知道有没有时间和动力;
这篇主要介绍作为一个android developer最近这段时间使用flutter(比较初级)的一些感受吧,具体的技术细节准备好了,后面的文章会慢慢分功能模块整理出来。

作为一个android程序员,学点其他相关的很正常;比如web前端也懂一点,后端也懂一点。但是学一个东西肯定不是脑袋一热就去搞,什么都去搞搞,哪有那么多时间。毕竟上班拿工资就要写android业务的,一周也就下班回来2、3个小时和周末是自由的,还要去掉减压的时间。
所以为什么会去学flutter呢?

flutter优势:

提起flutter,最先谈的就是它的跨平台咯。
用dart语言编写,一套代码在android、ios上运行。相比于RN页面由前端写,flutter则是以一种新的形势出现,独立于android、ios、web;这样的好处是,前端也不会flutter,大家基本都在同一起跑线(个人感觉);
当demo在两个模拟器上都跑起来的时候还是很开心的,哈哈。
如果后面Fuchsia出来了,可以跨Fuchsia就更牛逼了。

这段时间大家都应该听说google和甲骨文公司的纠纷,以及前段时间欧盟android收费等消息。
android从java到提供kotlin开发,然后到现在flutter的出现。
然后就是新的google Fuchsia系统(统一android和chrome os),也是用dart语言开发,不确定是不是flutter。如果后面这个新的系统真的出来,并且可以在手机上跑,那么到时候移动端很可能是android ios Fuchsia三分天下了。
这里就有问题了(以下只是个人见解,以及一些危机意识):
现在每个公司除了跨平台,都有android、ios独立的开发小组,那么Fuchsia出来后呢?三个小组?然后发现flutter写的在三个系统都可以跑,那还有必要开三份工资吗?
或者说会保留一些原生开发,可能一些功能跨平台做不了,还是要每个原生系统自己去实现(模块的方式)。但是大部分还是跨平台去实现了。如果真是这样,那么如果只会android或者只会ios,到时候说不定真的会凉凉,难受啊马飞。
但是这也算是一个机会吧,如果Fuchsia真的火起来了,一些大厂或者针对海外市场的公司应该会去占领这个新的操作系统的市场。到时候只有小部分开发者会flutter,而你刚好在其中(熟练&精通),岂不是美滋滋。

flutter的缺点:

说说个人最近使用flutter后对flutter的一些吐槽吧

会比android原生apk大一些。因为渲染引擎放到了app里面。


image.png image.png

下面是apk(别人github上的项目,业务较少)体积:


image.png

(到目前由于经验较少,不确定业务量增大后,apk大小增长的速度是不是和原生的一致了。如果本来apk就有50多M,flutter引擎如果只是增加7M,一共60M,貌似也可以接受)

至于为什么要把引擎放到app里面,现在我也不懂。google了一下,看有人说应用程序中包含 C / C ++ 引擎和 Dart VM是为了应用程序直接使用本机指令集运行,不涉及任何解释器。

每次重新绘制那一下,特别是列表滑动,android上稍微认真观察,就会发现会卡一下。ios不明显,android比较明显。闲鱼的详情页也有这种情况。
flutter ui的概念是every thing is widget,就连页面也是一个widget。widget又分有状态和无状态。
个人觉得吧,无状态的widget就是为了让Ui不要重新绘制。
猜测原因(没看过flutter的cpu proflier,纯属瞎BB):list滑动刷新通过有状态widegt来刷新状态(setState)来重新绘制页面造成的瞬间卡顿。

(demo是stackoverflow上的一个flutter使用相对布局的回答,然后答得太好直接被官网引用了,牛逼啊)
可能ios开发要好适应一些,但是android开发习惯了xml布局,刚开始接触可能不太适应(使用一阵子就习惯了)。
android里面看Ui布局,一般是通过xml来看大概的布局,虽然有时也会用代码动态管理ui,不过大部分还是习惯用xml布局。
比如下图:
flutter的布局是一层套一层,如果要使用复杂一点的布局,就得嵌套多层。下面的布局是list的一个小item。

class Song extends StatelessWidget {
  const Song({this.title, this.author, this.likes});

  final String title;
  final String author;
  final int likes;

  @override
  Widget build(BuildContext context) {
    TextTheme textTheme = Theme.of(context).textTheme;
    return new Container(
      margin: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 5.0),
      padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 0),
      decoration: new BoxDecoration(
        color: Colors.grey.shade200.withOpacity(0.3),
        borderRadius: new BorderRadius.circular(5.0),
      ),
      child: new IntrinsicHeight(
        child: new Row(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            new Container(
              margin: const EdgeInsets.only(
                  left: 0, top: 4.0, bottom: 4.0, right: 10.0),
              child: new CircleAvatar(
                backgroundImage: new NetworkImage(
                    'http://thecatapi.com/api/images/get?format=src'
                    '&size=small&type=jpg#${title.hashCode}'),
                radius: 20.0,
              ),
            ),
            new Expanded(
              child: new Container(
                child: new Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: <Widget>[
                    new Text(title, style: textTheme.subhead),
                    new Text(author, style: textTheme.caption),
                  ],
                ),
              ),
            ),
            new Container(
              margin: new EdgeInsets.symmetric(horizontal: 5.0),
              child: new InkWell(
                child: new Icon(Icons.play_arrow, size: 40.0),
                onTap: () {
                  // TODO(implement)
                },
              ),
            ),
            new Container(
              margin: new EdgeInsets.symmetric(horizontal: 5.0),
              child: new InkWell(
                child: new Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    new Icon(Icons.favorite, size: 25.0),
                    new Text('${likes ?? ''}'),
                  ],
                ),
                onTap: () {
                  // TODO(implement)
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}
image.png

刚开始是会觉得这个好麻烦,代码里面利用row包children,children里面有clumn包children,就像一颗ui结构树一样,然后每个树节点用类似builder模式传一些参数进去描述具体节点特征。(下图是官网上另一个demo的例子,直接copy过来示意一下,和这个demo不对应)


image.png


好消息是可能是因为dart和flutter的机制,虽然没有xml看ui结构,但是可以通过代码旁的结构树来查看。点击树里面的节点还能对应到具体的代码位置。还是挺不错的。

image.png

总结&后续

总的来说flutter还是值得去看一看的,毕竟是google推出来的,国内闲鱼已经上线了。
至于学习到什么程度需要自己结合实际情况把控了,如果能运用到公司的项目里面那是最好不过了,在不荒废原生开发的情况下all in flutter。如果公司不使用flutter,就看个人的规划和空余时间有多少吧。
毕竟工作日公司要加班,回去要陪女朋友。
回去要陪女朋友 。 emmmm......看来我还是有时间的。
flutter要深入,还是要花很多时间的。反正慢慢搞嘛,又没有明显的dealine,白天学android,晚上学点其他的。
大前端的趋势是越来越明显了,但是谁也说不准,说不定哪天就突然去世,还是得靠原生开发。

上一篇下一篇

猜你喜欢

热点阅读