Flutter 是一套高效的跨平台免费开源 SDK,可以帮助开发者用一套代码同时在 Android 和 iOS 上构建媲美原生体验的精良应用。随着 Flutter 1.0 的正式到来,我们从社区中也搜集到了不少开发者关注的问题,我们会用连载的形式由浅到深地为开发者们进行解答。如果您对 Flutter 已经有一定的了解,不妨在看到问题的时候先试着回答,然后和我们给出的答案进行比较,从而进一步加深理解。
介绍篇
Flutter 是什么?
▼
Flutter 是 Google 的移动应用 SDK,用于在极短时间内在 Android 和 iOS 平台上创建高质量的原生体验。Flutter 可以和既有代码相容,世界各地的很多开发者和组织都在使用它,并且它是免费和开源的。
Flutter 能做什么?
▼
对于应用的用户来说,Flutter 可以让他们体验到美观灵活的 UI。
对于开发者来说,Flutter 降低了创建移动应用的门槛。它加速了移动应用的开发,降低了兼顾 Android 和 iOS 应用开发的成本和复杂性。
对于设计师而言,Flutter 可以确保精确地实现设计意图,而无需降低保真度或被迫进行妥协。在设计师的手里,Flutter 还可以作为一种高效的原型设计工具。
哪些人会用到 Flutter?
▼
Flutter 适用于希望快速构建精美的移动应用,或者希望用一套代码库覆盖更多用户的开发者。
Flutter 也适用于需要领导移动开发团队的开发管理人员。Flutter 可以让开发管理人员打造一个统一的移动应用开发团队,以便更快地开发更多功能,同时将相同的功能部署到 Android 和 iOS 版本的应用中,并降低维护成本。
虽然设计师群体不是 Flutter 最初的目标受众,但 Flutter 也适用于那些希望将原始设计意图高保真地传递给所有移动用户的设计师。
说到底,如果您想要漂亮的应用,令人愉悦的动效和动画,以及富有个性和身份感的 UI,那您就是 Flutter 的目标用户。
我需要拥有怎样的开发经验才能使用 Flutter?
▼
如果您熟悉面向对象概念 (类、方法、变量等) 和指令式编程概念 (循环、条件等) ,您会发现 Flutter 很容易上手。
不过需要强调的是,学习和使用 Flutter 无需具备移动领域的开发经验。
就我们亲历过的例子来说,编程经验并不丰富的人们一样可以学习并使用 Flutter 进行原型设计和应用开发。
我可以用 Flutter 构建怎样的应用?
▼
Flutter 针对在 Android 和 iOS 上运行的 2D 移动应用进行了优化。
如果您的应用强烈需要表达出品牌个性,Flutter 会非常适合。不过,即便您想要打造的应用看起来像是股票平台那样复杂,也可以使用 Flutter 来构建。
Flutter 可以构建功能齐全的应用,包括使用摄像头、地理位置、网络、存储、第三方 SDK 等。
Flutter 有哪些独到之处?
▼
Flutter 与大多数用来构建移动应用的工具不同,因为它既不使用 WebView,也不使用设备附带的 OEM Widget,而是使用自己的高性能渲染引擎来绘制 Widget。
Flutter 与其它工具的不同之处还在于,它只有一层简洁的 C/C++ 代码,在这之上,Flutter 使用 Dart (一种现代化的、简洁的面向对象语言) 实现其大部分系统功能 (布局、手势、动画、框架、Widget 等),这种语言使得开发者可以轻松地进行阅读、更改、替换或删除。
这些特性都为开发者提供了巨大的系统控制权限,同时显著降低了访问大多数系统功能的门槛。
内容篇
Flutter SDK 里有什么?
▼
高度优化的针对移动应用的 2D 渲染引擎,更具备出色的文字支持功能、现代化的 react 风格框架、适用于 Android 和 iOS 的丰富 Widget、用于单元和集成测试的 API、用于连接系统和第三方 SDK 的互操作及插件 API、无界面 (headless) 测试运行器,用于在 Windows、Linux 和 Mac 上运行测试、命令行工具,用于创建、构建、测试和编译应用。
用 Flutter 开发时可以使用哪些编辑器或 IDE ?
▼
可以通过插件的方式使用 Android Studio、IntelliJ IDEA 和 VS Code 进行 Flutter 开发。您也可以在命令行中使用 flutter 命令,并配合能编辑 Dart 语言的编辑器进行开发。
Flutter 里存在开发框架吗?
▼
是的,Flutter 自带了现代化的开发框架,灵感正是来自 React。Flutter 的框架旨在实现分层、可定制 (以及灵活的开发选项)。开发者可以选择仅使用框架的一部分,或是使用另外的框架。
Flutter 里存在 Widget 吗?
▼
是的,Flutter 自带了一套高品质的 Material Design 和 Cupertino (iOS 风格) Widget、布局和主题。当然,这些 Widget 只是一个起点。Flutter 的设计目的就是,让您轻松创建自己的 Widget,或是定制现有的 Widget。
Flutter 支持 Material 主题定制 (Theming) 吗?
▼
是的,Flutter 和 Material 团队密切合作,完全支持 Material Theming。
Flutter 带有测试框架吗?
▼
是的,Flutter 提供用于编写单元和集成测试的 API。我们使用自己的测试功能来测试我们的 SDK,每次提交代码前我们都会测量提交的测试覆盖率。
Flutter 和 ReactNative( RN ) 的异同?
▼
RN 是使用JS代码调用系统的原生控件,最高支持 60fps。
Flutter 不使用系统的原生控件, Flutter 基于GPU渲染,所以确保了 高性能,最高支持120fps,甚至不输原生。
Flutter只需要维护一套UI 代码:Flutter 在IOS和Android 是一套 UI 风格组件,所以 Flutter 需要做很少适配,因为上层只有一套UI代码。RN是同一套代码在IOS和Android显示不同的风格,需要适配维护两个代码库。
相同点: 和RN类似,基于组件开发Weight,一切皆组件。
Flutter引擎有多大?
▼
官方曾测量了一个最小的 Flutter 应用(不含 Material 组件,仅有一个 Center 控件,使用 flutter build apk 构建),并打包为 release 版本,大小约为 4.06 MB。该APP:核心引擎大约为 2.7MB(已压缩),框架和应用程序代码大约 820.6KB (已压缩),LICENSE 文件为 53.5KB(已压缩),必要的 Java 代码 (classes.dex) 为 61.8KB(已压缩),此外还有大约 450.4KB(已压缩)的 ICU 数据。
因此相对应用程序,Flutter的引擎并不大。
Flutter可以构建桌面应用程序吗?
▼
可以,但目前专注于移动端优先。未来会支持 WIndows , Mac 和 Linux。
Flutter的标记语言在哪里?
为什么Flutter没有标记语法(类似于Android的XML布局文件)?
▼
和Android原生开发不同,使用代码动态构建的UI会更灵活:
-
严格的标记系统难以表达和生成具有特定行为的widget。
-
“代码优先”更好地支持热重载和动态环境适应等功能。
可以在Flutter中使用JSON 吗?
▼
必须可以,有关如何在Flutter中使用JSON的教程,请参阅 JSON教程。
Flutter支持和原生混合开发么?可以在当前原生APP中嵌入Flutter么?
可以,目前可以在现有的Android或iOS应用中嵌入Flutter,但是当前可能不太完善。
这里是官方文档以供参考。
为什么Flutter选择使用Dart语言?
▼
Dart运行时和编译器支持Flutter的混合编译:
基于JIT的快速开发周期:允许使用类型的语言进行形状更改和有状态的热重载
基于AOT编译器,可生成高效的ARM代码,可以快速启动并拥有可预测的生产部署性能。
Dart由谷歌维护,Dart社区正在积极投入资源改进Dart在Flutter中的使用。
Dart语言效率高,这点最重要!!!,这对framework团队和开发人员都非常重要。因为大部分Flutter功能都是用Dart实现,因此我们需要在10万行代码时能保持高效的而不会牺牲framework和widget的可读性。
Dart面向对象。绝大多数开发人员都具有面向对象开发的经验,因此更容易学习如何使用Flutter进行开发。
Dart可预测,高性能。 Flutter框架使用函数式流,它很大程度上依赖于底层的内 存分配器,从而有效地处理小的、短期的内存分配会非常重要,所以在缺 乏此功能的语言中Flutter无法有效地工作。
Flutter是什么语言编写的?
▼
Flutter的不同是因为它核心只有一层轻量的C/C++代码。Flutter在Dart中实现了其它大部分系统(组合、手势、动画、框架、widget等),开发人员可以轻松地进行读取、更改、替换或移除。这为开发人员提供了对系统的巨大可定制性。
Flutter框架使用什么编程范式?
▼
Flutter是一个多范式编程环境。 集合了过去十多年优秀的开发范式:
组合:Flutter使用的主要范例是使用小对象,然后将它们组合在一起以获得更复杂的对象。比如Weight之间的相互嵌套。
函数式编程:整个应用程序可以仅使用StatelessWidget来构建 ,这些函数本质上是描述参数如何映射到其他函数的函数。
事件驱动:用户交互由事件对象表示,这些事件对象被分派给注册了事件处理程序的回调。屏幕刷新也由类似的回调机制触发。
基于类的面向对象编程:框架的大部分API都是使用继承类来构建的。我们使用一种方法来在基类中定义非常抽象的API,然后在子类中迭代地对它们进行定制化。
命令式编程:直接命令式编程通常与对象内部封装的状态配对,用于提供最直观的解决方案。
响应式编程:widget和元素树有时被描述为响应式的,因为在widget的构造函数中提供的新输入会立即作为widget的构建方法对较低级别widget的更改传播,并在较低widget中进行更改(例如,作为响应到用户输入)通过事件处理程序传播回widget树。
泛型:泛型检测可用于帮助开发人员及早发现编程错误。Flutter框架使用泛型编程来处理这个问题。
并发:Flutter大量使用异步API。例如,动画系统通过Future来完成动画完成时的通知。图像加载系统同样使用Future在加载完成时进行报告。
约束:Flutter中的布局系统使用弱形式的约束编程来确定布局的几何形状。约束(例如,父控件将大小约束传给子控件)满足这些限制。通过使用这种技术,Flutter可以更加精准的控制布局。
网友评论