创建应用
- 打开 IDE,选择 新 Flutter 项目 (Start a new Flutter project).
- 选择 Flutter 应用程序 作为项目类型,然后点 下一步
- 确认 Flutter SDK 路径 区域所示路径是正确的 SDK 路径。如果你还没有安装 SDK,需要先进行安装,选择 Install SDK…。
- 输入项目名称(比如 ‘myapp’), 然后点击下一步。
- 点击 完成。
- 待 Android Studio 安装 SDK 后,创建项目。
APP代码结构
1 | firstApp |
其中android里面的就是生成的android相关的文件,而ios里面是生成的ios相关的文件,lib中则是flutter的dark文件。如果需要添加其他的文件,则一般会直接在根目录下添加,比如我们需要使用外部图片和Icon资源,所以我们在项目根目录下分别创建“imgs”和“fonts”文件夹。
第一个页面
1 | import 'package:flutter/material.dart'; |
- 本示例创建了一个具有 Material Design 风格的应用, Material 是一种移动端和网页端通用的视觉设计语言, Flutter 提供了丰富的 Material 风格的 widgets。在
pubspec.yaml
文件的flutter
部分选择加入uses-material-design: true
会是一个明智之举,通过这个可以让您使用更多 Material 的特性,比如其预定义好的 图标 集。 - 主函数(main)使用了 (
=>
) 符号,这是 Dart 中单行函数或方法的简写。 - 该应用程序继承了
StatelessWidget
,这将会使应用本身也成为一个 widget。在 Flutter 中,几乎所有都是 widget,包括对齐 (alignment)、填充 (padding) 和布局 (layout)。 Scaffold
是 Material 库中提供的一个 widget,它提供了默认的导航栏、标题和包含主屏幕 widget 树的 body 属性。 widget 树可以很复杂。- 一个 widget 的主要工作是提供一个
build()
方法来描述如何根据其他较低级别的 widgets 来显示自己。 - 本示例中的 body 的 widget 树中包含了一个
Center
widget, Center widget 又包含一个Text
子 widget, Center widget 可以将其子 widget 树对齐到屏幕中心。
使用外部 package
pubspec.yaml
文件管理 Flutter 应用程序的 assets(资源,如图片、package等)。在pubspec.yaml 中,将 english_words(3.1.5 或更高版本)添加到依赖项列表
1 | dependencies: |
同时点击Pub get 会将依赖包安装到你的项目。
在 lib/main.dart
中引入:
1 | import 'package:flutter/material.dart'; |
使用并替换文本内容
1 | final wordPair = WordPair.random(); |
在现有工程中添加Flutter
Dark语言简介
变量
var:类似于JavaScript中的var
,它可以接收任何类型的变量,但最大的不同是Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型。
dynamic 和 Object:Object
是Dart所有对象的根基类。任何类型的数据都可以赋值给Object
声明的对象。dynamic和**Object **声明的变量可以在后期改变赋值类型。
dynamic
与Object
不同的是,dynamic
声明的对象编译器会提供所有可能的组合, 而Object
声明的对象只能使用Object的属性与方法, 否则编译器会报错
1 | dynamic a; |
final和const:如果您从未打算更改一个变量,那么使用 final
或 const
,不是var
,也不是一个类型。 一个 final
变量只能被设置一次,两者区别在于:const
变量是一个编译时常量,final
变量在第一次使用时被初始化。
函数
函数可以赋值给变量或作为参数传递给其他函数
函数声明:
1 | bool isNoble(int atomicNumber) { |
对于只包含一个表达式的函数,可以使用简写:
1 | bool isNoble (int atomicNumber)=> _nobleGases [ atomicNumber ] != null ; |
函数作为变量:
1 | var say = (str){ |
函数作为参数传递:
1 | void execute(var callback) { |
可选的位置参数
包装一组函数参数,用[]标记为可选的位置参数,并放在参数列表的最后面:
1 | String say(String from, String msg, [String device]) { |
可选的命名参数
定义函数时,使用{param1, param2, …},放在参数列表的最后面,用于指定命名参数
1 | void enableFlags({bool bold, bool hidden}) { |
异步
Future
或者Stream
对象的函数,被称为异步函数。async
和await
关键词支持了异步编程,允许您写出和同步代码很像的异步代码。
Future
表示一个异步操作的最终完成(或失败)及其结果值的表示。简单来说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。
Future.then:Future.delayed
创建了一个延时任务
1 | Future.delayed(new Duration(seconds: 2),(){ |
Future.catchError:如果异步任务发生错误,我们可以在catchError
中捕获错误
1 | Future.delayed(new Duration(seconds: 2),(){ |
then
方法还有一个可选参数onError
,我们也可以它来捕获异常:
1 | Future.delayed(new Duration(seconds: 2), () { |
Future.whenComplete:我们会遇到无论异步任务执行成功或失败都需要做一些事的场景,可以使用Future
的whenComplete
回调
1 | Future.delayed(new Duration(seconds: 2),(){ |
Future.wait:需要等待多个异步任务都执行结束后才进行一些操作,就可以使用wait
1 | Future.wait([ |
4s后才会打印
Async/await
和JavaScript中的async/await
功能和用法是一模一样的。
async
用来表示函数是异步的,定义的函数会返回一个Future
对象,可以使用then方法添加回调函数。await
后面是一个Future
,表示等待该异步任务完成,异步完成后才会往下走;await
必须出现在async
函数内部。
1 | task() async { |
Stream
Stream
也是用于接收异步事件数据,和Future
不同的是,它可以接收多个异步操作的结果(成功或失败)。 也就是说,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常
1 | Stream.fromFutures([ |