[译] 为什么 Flutter 能最好地改变移动开发

{this.backgroundColor = const Color(0xFF424242),
this.textColor = Colors.white});

@override
Widget build(BuildContext context) {
return new Container(
decoration: new BoxDecoration(
color: backgroundColor,
shape: BoxShape.rectangle,
borderRadius: new BorderRadius.circular(12.0)),
child: new Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0, horizontal: 6.0),
child: new Text(
text,
style: new TextStyle(color: textColor, fontSize: 12.0),
),
),
);
}
}

TextBubble 部件类。

想象一下在安卓系统中建立这样的自定义视图会有多难。然而,在 Flutter 上,这只是一件几分钟就能完成的事情。能够将 UI 界面的一部分提取到像小部件这样的独立单元中,可以很容易地在应用程序中重用这些小部件,甚至跨越不同的应用。你会注意到,这个布局的很多部分都是我们在应用的不同视图上重复使用的,让我告诉你:这实施起来小菜一碟,所以我决定将应用扩展到包含电视节目。几个小时之后,这件事情就完成了。这款应用集电影和电视节目于一体,在这个过程中并没有让人很头疼。我通过构建用于加载和显示数据的泛型类来做到这一点,这让我可以重用每个布局用于电影和节目。但是,为了在 Android 上完成同样的事情,我不得不在电影和节目中使用不同的 Activity。你可以想象这维护起来的速度有多快,但是我觉得 Andriod 不够灵活,无法以一种更干净、更简单的方式去共享这些布局。


在 Flutter 实验的最后,我得出了非常直接和更有说服力的结论:

我编写出了同时运行在 iOS 和 Andriod 上的更好、更容易维护的代码,并且只需要相当少的时间和更少的代码数量。

其中最好的部分是不用处理像 fragments 和 SupportCompatFragmentManagerCompat 这样的事情,并且以一种单调、容易出错的方式保存和手动管理状态。它没有像 Andriod 开发那样令人沮丧…… 不用再等待 30 秒的“即时重载”来更改 TextView 的字体大小。不再使用 XML 来布局。不再使用 findViewById(我知道有 Butterknife, Databinding, Kotlin-Extensions 这样的工具,但你应该明白我的意思)。不再有冗杂的样板代码 —— 只有结果。

一旦这两个应用在功能上或多或少都写在同一页面上时,我很想知道代码行数之间有没有什么区别。一个 repository 仓库和另一个之间相比如何?(快速免责声明:我还没有在 Flutter 应用中集成持久存储,而且原始应用的代码库相当混乱)。让我们用 Cloc 来比较下代码,为了简单起见,让我们看看 Android 上的 Java 和 XML 文件,Flutter 应用上的 Dart 文件数量(不包括第三方库,这可能会大大增加 Android 的度量)。

用 Java 编写原生 Android 应用:

Meta-Data for the native Android app

http://cloc.sourceforge.net v 1.60 T=0.42 s (431.4 files/s, 37607.1 lines/s)

Language files blank comment code

Java 83 2405 512 8599
XML 96 478 28 3577
Bourne Again Shell 1 19 20 121
DOS Batch 1 24 2 64
IDL 1 2 0 15

SUM: 182 2928 562 12376

Flutter:

Meta-Date for the Flutter app

http://cloc.sourceforge.net v 1.60 T=0.16 s (247.5 files/s, 14905.1 lines/s)

Language files blank comment code

Dart 31 263 39 1735
Bourne Again Shell 1 19 20 121
DOS Batch 1 24 2 64
XML 3 3 22 35
YAML 1 9 9 17
Objective C 2 4 1 16
C/C++ Header 1 2 0 4

SUM: 40 324 93 1992

为了解决这个问题,让我们先比较一下文件数量: Android: 179 (.java 和 .xml) Flutter: 31 (.dart) 哇!还有文件中的代码行数: Android:12176 Flutter: 1735

这让人难以置信!我原以为 Flutter 应用的代码量可能只有原生 Andriod 应用的一半,结果竟然减少了 85%?这真的让我始料未及。但是当你开始思考这个问题的时候,你会发现很有意义:因为所有的布局、背景、图标等都需要在 XML 中指定,但是仍然需要使用 Java 或 Kotlin 代码链接到应用中,当然会存在大量的代码。另一方面,Flutter 可以同时完成所有这些操作,同时将这些值绑定到 UI 界面中。你可以做到这一切,而不需要处理 Andriod 数据绑定的缺陷,比如设置监听器或处理生成的绑定代码。我开始意识到在 Android 上开发这些基本的功能是多么的麻烦。为什么我们要为 Fragment/Activity 参数、adapter、状态管理和恢复写一堆同样的代码呢?

通过 Flutter,你只会关注你的产品和如何开发产品。SDK 给人的感觉更多的是帮助,而不是一种负担。

当然,这仅仅是 Flutter 的开始,因为它仍然处于测试阶段,尚未达到像 Android 的成熟程度。然而,相比之下,Android 似乎已经达到了极限,我们可能很快就会用 Flutter 去编写我们的Andriod 应用。现在还有一些问题有待解决,但总的来说, Flutter 的未来一片光明。我们已经为 Android Studio、VS Code 和 IntelliJ 、分析器和视图检查工具提供了很好的插件,而且还会有更多的工具。这一切都让我相信 Flutter 不仅会是另一个跨平台的框架,更是一个更大的开端 —— 应用开发新纪元的开始。

并且 Flutter 可以远远超越 Android 和 iOS 领域。如果你一直在关注小道消息,你可能已经听说谷歌正在开发一款名为 Fuchsia 的新操作系统。事实证明,Fuchsia 的 UI 界面是用 Flutter 所构建的。


当然,你可能会问自己:我现在是不是必须学习一个全新的框架吗?我们刚刚开始学习关于 Kotlin 和使用一些架构组件,现在一切都很好。为什么我们要去了解 Flutter 呢?但是让我告诉你:在使用 Flutter 之后,你将开始了解 Android 开发的问题,并且可以清楚地看到,Flutter 的设计更适合现代的、响应式的应用。

当我第一使用 Android 的 数据绑定框架 Databinding 时候,我认为它是革命性的,但它也感觉像一个不完整的产品。在处理布尔表达式的时候,监听器和更复杂的布局对 Databinding 来说是冗长乏味的一个步骤,这让我意识到 Andriod 不应是为这样的工具设计的。现在如果你看一下 Flutter,它使用了与 Databinding 相同的理念,它将你的视图或控件绑定到变量中,而无需手动在 Java 或 Kotlin 中实现,同时它不需要通过生成绑定文件来连接 XML 和 Java。这让你可以将之前至少一个 XML 和 Java 文件压缩成一个可重用的 Dart 类。

我还认为,Android 上的布局文件不能单独地做任何事情。它们首先必须调用 inflate 方法,只有这样我们才能设值。同时引入了状态管理的问题,并提出一个问题:当基础值改变的时候,我们怎么办?手动抓取对应视图的引用并重新赋值?这种解决方法非常容易出错,我不认为像这样管理视图的方法是好的。相反,我们应该使用状态来描述我们的布局,并且每当状态发生变化时,让框架通过重新呈现其值发生变化的视图来接管。这样,我们的应用程序状态就不会与视图显示的内容不同步了。Flutter 就是这么做的!

可能还有更多的问题:你有没有曾经问过自己为什么在 Android 上创建一个工具栏菜单是如此复杂?为什么我们要用 XML 来描述菜单项,而且在这里我们不能将任何业务逻辑绑定它上面(这就是菜单的全部目的),我们只能在 Activity/Fragment 的回调中编写,然后再在另一个回调中绑定点击监听器。为什么我们不能像 Flutter 一样一次性完成这些事情?

class ToolbarDemo extends StatelessWidget {

@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
actions: [
new IconButton(
icon: new Icon(Icons.star),
onPressed: _handleClickFavorite
),
new IconButton(
icon: new Icon(Icons.add),
onPressed: _handleClickAdd
)
],
),
body: new MovieDetailScreen(),
);
}

_handleClickFavorite() {}

_handleClickAdd() {}
}
用 Flutter 将菜单 items 添加至 Toolbar。
正如在代码段所见,我们将菜单 items 作为 Action 添加在 AppBar。这就是你接下来要做的 —— 不再将图标导入到 XML 文件中,不需要再重写回调了。这就像在控件树上添加一些控件一样简单。


虽然我可以一直往下说,但是你要知道:想想你不喜欢 Andriod 开发的所有事情,然后考虑如何解决这些问题的同时,重新设计框架。这是一项艰巨的任务,但是这样做可以帮你理解为什么 Flutter 会出现,更重要的是,它为什么可以留下来。公平地说,有很多应用(从现在开始)我仍然会用原生的 Andriod 和 Kotilin 一起编写,原生 Android 也许有它的缺点,但它也有它的好处。但是说到底,我认为用了 Flutter 之后,仍使用原生 Andriod 来开发一个应用会变得越来越难。


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

资源分享

  • 最新大厂面试专题

这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

  • 对应导图的Android高级工程师进阶系统学习视频
    最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!

…(img-syZkAbc9-1710851420341)]

  • 对应导图的Android高级工程师进阶系统学习视频
    最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!

[外链图片转存中…(img-TK7YE5Qx-1710851420342)]

下载方法:点赞+关注后 点击【Android高级工程师进阶学习】即可领取!

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值