• 关于Flutter


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

    Flutter是什么?

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

    Flutter目标是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序。兼容滚动行为、排版、图标等方面的差异。

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

    为什么要用Flutter?

    提高开发效率

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

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

    • 受益于使用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/

  • 相关阅读:
    排序算法之快速排序
    设计模式之原型模式
    设计模式之门面模式
    第五十四课 树中节点的插入操作
    第五十三课 树中节点的查找操作
    第五十二课 树的存储结构与实现
    第五十一课 树的定义与操作
    第五十课 排序的工程应用示例
    第四十九课 归并排序和快速排序
    第四十八课 冒泡排序和希尔排序
  • 原文地址:https://www.cnblogs.com/Fingerprint/p/11200949.html
Copyright © 2020-2023  润新知