本文档适用那些但愿将现有 iOS 经验应用于 Flutter 的开发者。若是你拥有 iOS 开发基础,那么你可使用这篇文档开始学习 Flutter 的开发。javascript
开发 Flutter 时,你的 iOS 经验和技能将会大有裨益,由于 Flutter 依赖于移动操做系统的众多功能和配置。Flutter 是用于为移动设备构建用户界面的全新方式,但它也有一个插件系统用于和 iOS(及 Android)进行非 UI 任务的通讯。若是你是 iOS 开发专家,则你没必要将 Flutter 完全从新学习一遍。html
你能够将此文档做为 cookbook,经过跳转并查找与你的需求最相关的问题。java
在 iOS 中,构建 UI 的过程当中将大量使用 view 对象。这些对象都是 UIView
的实例。它们能够用做容器来承载其余的 UIView,最终构成你的界面布局。ios
在 Flutter 中,你能够粗略地认为 Widget
至关于 UIView
。Widget 和 iOS 中的控件并不彻底等价,但当你试图去理解 Flutter 是如何工做的时候,你能够认为它们是“声明和构建 UI 的方法”。算法
然而,Widget 和 UIView 仍是有些区别的。首先,widgets 拥有不一样的生存时间:它们一直存在且保持不变,直到当它们须要被改变。当 widgets 和它们的状态被改变时,Flutter 会构建一颗新的 widgets 树。做为对比,iOS 中的 views 在改变时并不会被从新建立。可是与其说 views 是可变的实例,不如说它们被绘制了一次,而且直到使用 setNeedsDisplay()
以后才会被从新绘制。数据库
此外,不像 UIView,因为不可变性,Flutter 的 widgets 很是轻量。这是由于它们自己并非什么控件,也不会被直接绘制出什么,而只是 UI 的描述。编程
Flutter 包含了 Material 组件库。这些 widgets 遵循了 Material 设计规范。MD 是一个灵活的设计系统,而且为包括 iOS 在内的全部系统进行了优化。json
可是用 Flutter 实现任何的设计语言都很是的灵活和富有表现力。在 iOS 平台,你可使用 Cupertino widgets 来构建遵循了 Apple’s iOS design language 的界面。canvas
在 iOS 上更新 views,只须要直接改变它们就能够了。在 Flutter 中,widgets 是不可变的,并且不能被直接更新。你须要去操纵 widget 的 state。安全
这也正是有状态的和无状态的 widget 这一律念的来源。一个 StatelessWidget
正如它听起来同样,是一个没有附加状态的 widget。
StatelessWidget
在你构建初始化后再也不进行改变的界面时很是有用。
举个例子,你可能会用一个 UIImageView
来展现你的 logo image
。若是这个 logo 在运行时不会改变,那么你就能够在 Flutter 中使用 StatelessWidget
。
若是你但愿在发起 HTTP 请求时,依托接收到的数据动态的改变 UI,请使用 StatefulWidget
。当 HTTP 请求结束后,通知 Flutter 框架 widget 的 State
更新了,好让系统来更新 UI。
有状态和无状态的 widget 之间一个很是重要的区别是,StatefulWidget
拥有一个 State
对象来存储它的状态数据,并在 widget 树重建时携带着它,所以状态不会丢失。
若是你有疑惑,请记住如下规则:若是一个 widget 在它的 build
方法以外改变(例如,在运行时因为用户的操做而改变),它就是有状态的。若是一个 widget 在一次 build 以后永远不变,那它就是无状态的。可是,即使一个 widget 是有状态的,包含它的父亲 widget 也能够是无状态的,只要父 widget 自己不响应这些变化。
下面的例子展现了如何使用一个 StatelessWidget
。一个常见的 StatelessWidget
是 Text
widget。若是你查看 Text 的实现,你会发现它是 StatelessWidget 的子类。
Text( 'I like Flutter!', style: TextStyle(fontWeight: FontWeight.bold), );
阅读上面的代码,你可能会注意到 Text
widget 并不显示地携带任何状态。它经过传入给它的构造器的数据来渲染,除此以外再无其余。
可是,若是你但愿 I like Flutter
在点击 FloatingActionButton
时动态的改变呢?
为了实现这个,用 StatefulWidget
包裹 Text
widget,并在用户点击按钮时更新它。
举个例子:
class SampleApp extends StatelessWidget { // This widget is the root of your application.