关于Flutter

“就像你问我怎么才能造坦克,我就必须把从冶金到化工整个现代化工业体系给你讲一遍。”——tombkeeper编程

 

Flutter是什么?安全

Flutter是一款移动应用程序SDK,一份代码能够同时生成IOS和Android两个高性能、高保真的应用程序。数据结构

Flutter目标是使开发人员可以交付在不一样平台上都感受天然流畅的高性能应用程序。兼容滚动行为、排版、图标等方面的差别。并发

应用程序使用Dart语言编写的,若是使用过Java或JavaScript之类的语言,则该应用程序看起来会很熟悉。框架

 

为何要用Flutter?less

提升开发效率异步

  • 同一份代码开发iOS和Android
  • 用更少的代码作更多的事情
  • 轻松迭代
    • 在应用程序运行时更改代码并从新加载(经过热重载)
    • 修复崩溃并继续从应用程序中止的地方进行调试

建立美观,高度定制的用户体验ide

  • 受益于使用Flutter框架提供的丰富的Material Design和Cupertino(iOS风格)的widget
  • 实现定制、美观、品牌驱动的设计,而不受原生控件的限制

 

Flutter和React-Native、Weex这样的动态化框架有什么不一样?函数式编程

React-Native、Weex核心是经过Javascript开发,执行时须要Javascript解释器,UI是经过原生控件渲染。Flutter与用于构建移动应用程序的其它大多数框架不一样,由于Flutter既不使用WebView,也不使用操做系统的原生控件。 相反,Flutter使用本身的高性能渲染引擎来绘制widget。Flutter使用C、C ++、Dart和Skia(2D渲染引擎)构建。在IOS上,Flutter引擎的C/C ++代码使用LLVM编译,任何Dart代码都是AOT编译为本地代码的,Flutter应用程序使用本机指令集运行(不涉及解释器)。而在Android下,Flutter引擎的C/C ++代码是用Android的NDK编译的,任何Dart代码都是AOT编译成本地代码的,Flutter应用程序依然使用本机指令集运行(不涉及解释器)。所以,Flutter能达到原生应用同样的性能。函数

同时,Flutter提供了一组本身的widget),由Flutter的framework和引擎管理和渲染。您能够浏览Flutter widget的目录。之因此不适用原生控件,是由于Flutter但愿最终结果是更高质量的,若是Flutter使用原生系统widget,Flutter应用的质量和性能将受到这些widget自己质量的限制。例如,在Android中,有一组硬编码的手势和固定的规则来对它们进行手势冲突消歧。在Flutter中,您能够编写本身的手势识别器,该手势识别器是手势系统中的一级参与者 。此外,由不一样人撰写的两个小工具可协调手势冲突消歧。

为何Flutter选择使用Dart语言?

Flutter在四个主要维度进行了评估,并考虑了框架做者、开发人员和最终用户的需求等因素。咱们发现不一样的语言在不一样的层面符合一部分需求,但Dart在全部评估维度上得分都很高,而且符合咱们的全部要求和标准。

Dart运行时和编译器支持Flutter的两个关键特性的组合:基于JIT的快速开发周期:容许使用类型的语言进行形状更改和有状态的热重载;以及AOT编译器,可生成高效的ARM代码,能够快速启动并拥有可预测的生产部署性能。

此外,咱们有机会与Dart社区密切合做,Dart社区正在积极投入资源改进Dart在Flutter中的使用。例如,当咱们采用Dart时,该语言没有提供生成原生二进制文件的工具链(这对于实现可预测的高性能是颇有帮助的),可是如今实现了,由于Dart团队为Flutter构建了它。一样,Dart VM以前已经针对吞吐量进行了优化,但团队如今正在优化VM的延迟时间,这对于Flutter的工做负载更为重要。

Dart在如下主要标准上获得高分:

  • 开发人员的效率。Flutter的主要价值主张之一是经过让开发人员使用相同的代码库为iOS和Android建立应用程序,从而节省了工程资源。使用高效的语言能够进一步加速开发周期,并使Flutter更具吸引力。这对咱们的framework团队和开发人员都很是重要。大部分Flutter功能都是用Dart实现,所以咱们须要在10万行代码时能保持高效的而不会牺牲framework和widget的可读性。
  • 面向对象。虽然咱们可使用非面向对象的语言,但这意味着要从新解决几个难题。另外,绝大多数开发人员都具备面向对象开发的经验,所以更容易学习如何使用Flutter进行开发。
  • 可预测,高性能。借助Flutter,咱们但愿使开发人员可以快速建立流畅的用户体验。为了实现这一点,咱们须要可以在每一个动画帧中运行大量的代码。这意味着咱们须要一种既能提供高性能又能提供可预测性能的语言,而不会出现会致使丢帧的周期性暂停。
  • 快速内存分配。Flutter框架使用函数式流,它很大程度上依赖于底层的内存分配器,从而有效地处理小的、短时间的内存分配会很是重要,因此在缺少此功能的语言中Flutter没法有效地工做。

 

Flutter框架使用什么编程范式?

Flutter是一个多范式编程环境。在Flutter中使用了过去几十年中开发的许多编程技术。咱们使用的每个范式都是咱们相信该它的优点特别适合Flutter:

  • 组合:Flutter使用的主要范例是使用小对象,而后将它们组合在一块儿以得到更复杂的对象。Flutter widget库中的大多数widget都是以这种方式构建的。例如,Material FlatButton 类是使用MaterialButton 类构建, 该类自己使用IconTheme、InkWell、Padding、Center、Material、AnimatedDefaultTextStyle和ConstrainedBox组合 构建。该InkWell 使用内置GestureDetector。Material 是使用内置AnimatedDefaultTextStyle、NotificationListener和AnimatedPhysicalModel。等等,它们都是widget。

  • 函数式编程:整个应用程序能够仅使用StatelessWidget来构建 ,这些函数本质上是描述参数如何映射到其余函数的函数。在计算布局或绘制图形的底层(这些应用程序不拥有状态,所以一般是非交互式的)例如,Icon widget本质上是一个将其参数(颜色、 icon、size)映射到布局基本单元的函数。此外,大量使用的是不可变数据结构,包括整个Widget类层次结构以及许多支持类,如 Rect和 TextStyle也都是。Dart中的Iterable API常常用来处理框架中的值列表,它大量使用了函数式(map,reduce,where等)方法。
  • 事件驱动:用户交互由事件对象表示,这些事件对象被分派给注册了事件处理程序的回调。屏幕刷新也由相似的回调机制触发。监听类是动画系统的基础,它确立了与多个监听事件订阅模式。
  • 基于类的面向对象编程:框架的大部分API都是使用继承类来构建的。咱们使用一种方法来在基类中定义很是抽象的API,而后在子类中迭代地对它们进行定制化。例如,咱们的渲染对象有一个与坐标系无关的基类(RenderObject),而后咱们有一个子类(RenderBox),它引入了基于笛卡尔坐标系(x / width)和Y /高度)。
  • 基于原型的面向对象编程:  ScrollPhysics 类将实例连接起来组成适用于在运行时动态滚动的physics。这使得系统能够编写包含特定平台physics的分页physics,而无需在编译时选择平台。
  • 命令式编程:直接命令式编程一般与对象内部封装的状态配对,用于提供最直观的解决方案。例如,测试是以一种强制性风格编写的,首先描述测试中的状况,而后列出测试必须匹配的不变量,而后根据测试须要推动时钟或插入事件。
  • 响应式编程:widget和元素树有时被描述为响应式的,由于在widget的构造函数中提供的新输入会当即做为widget的构建方法对较低级别widget的更改传播,并在较低widget中进行更改(例如,做为响应到用户输入)经过事件处理程序传播回widget树。根据widget的需求,功能向应和命令响应两方面都存在于框架中。具备构建方法的widget仅由一个表达式组成,该表达式描述了widget如何对其配置中的变化作出反应的功能响应widget(例如,Divider类)。 构建方法经过几个语句构建子项列表的widget,描述了widget如何对其配置中的更改做出反应,这些都是命令性响应widget(例如 Chip类)。
  • 声明式编程:widget的构建方法一般是具备多层嵌套构造函数的单一表达式,使用Dart的严格声明子集编写。这样的嵌套表达式能够机械地转换成任何适合表达的标记语言或从任何适合表达的标记语言转换。例如, UserAccountsDrawerHeader widget具备很长的构建方法(20行以上),由单个嵌套表达式组成。这也能够与命令式风格相结合来构建用纯粹声明式方法难以描述的UI。
  • 泛型:类型可用于帮助开发人员及早发现编程错误。Flutter框架使用泛型编程来处理这个问题。例如, State类根据其关联widget的类型进行参数化,以便Dart分析器能够捕获状态和widget的不匹配。相似地, GlobalKey类须要的类型参数,以便它能够访问远程widget的状态下在一个类型安全的方式(使用运行时检查), 路由接口是参数化时,它是预期使用类型 pop和集合,例如List、Map和 Set都是参数化的,这样能够在分析过程当中或在调试期间的运行时提早捕获不匹配的元素。
  • 并发:Flutter大量使用 Future和其余异步API。例如,动画系统经过Future来完成动画完成时的通知。图像加载系统一样使用Future在加载完成时进行报告。
  • 约束:Flutter中的布局系统使用弱形式的约束编程来肯定场景的几何形状。约束(例如,对于笛卡尔盒子,最小和最大宽度以及最小和最大高度)从父母传递给孩子,而且孩子选择生成的几何结构(例如,对于笛卡尔盒子,大小,特别是宽度和高度)知足这些限制。经过使用这种技术,Flutter一般能够经过一次遍及整个场景。

 

Flutter和别的开发之间的关系?

以前有很多朋友,在公众号里问我,是学习Flutter开发仍是学习安卓开发?这个问题在我看来其实并不完整,由于一样你还能够问是学习Flutter开发仍是iOS开发?是学习Flutter开发仍是学习Web开发?

 

经过此次Developer Keynote咱们能够看出,Flutter是一种跨平台技术,而不属于Android技术,Goole的Android团队对于Flutter只字未提,而是建议使用Kotlin语言来进行开发。那么Google为何还要开发Flutter技术呢?由于跨平台开发市场即便Google不作也会有其余公司去作,好比FaceBook的RN,阿里的Weex。所以Flutter其实是在和这些公司的产品抢市场,而不是在和本身的Android团队抢市场。

 

因此这种问题其实没有什么标准的答案,你喜欢哪一个技术就能够去学哪一个技术,Flutter和Adroid并非那种二选一的关系,而是一种共生的关系。Flutter团队会继续完善这个跨平台开发的框架,Android团队也会继续发展本身的原生开发环境,他们都有着各自的优点,相信将来都会变得更加美好。

——郭霖《一篇文章带你看遍Google I/O 2019大会》

 

Flutter中文网:https://flutterchina.club/technical-overview/

Flutter-FAQ:https://flutterchina.club/faq/

相关文章
相关标签/搜索