前言
如果你只是写界面可能你看Flutter的Widget就够了。
可是当你写业务的时候,你不去了解Dart语言那么你讲寸步难行。
本文致力于以最小的篇幅介绍Flutter的敲门砖:Dart最必备的基础知识。
在Dart中,一切都是对象,一切对象都是class的实例,哪怕是数字类型、方法甚至null都是对象,所有的对象都是继承自Object
跟Java不同的是,Dart没有public protected private等关键字,如果某个变量以下划线(_)开头,代表这个变量在库中是私有的
一、变量
1、变量定义
1 | int b = 10; |
可以明确指定某个变量的类型,如int bool String,也可以用var或 dynamic来声明一个变量,Dart会自动推断其数据类型。
dynamic 则是告诉编译器,我们知道自己在做什么,不用做类型检测 。
2、变量类型检测
为了在运行时检测进行类型检测,Dart 提供了一个关键字 is:
1 | dynamic obj = {}; |
3、类型互转
3.1 String与int互转
1 | int.parse("100"); |
二、函数
1、函数的写法
以下三种函数的写法,都是正确的。
1 | // 写法1:声明返回值(推荐) |
所有的函数都有返回值,如果没有指定return语句,那么该函数的返回值为null。
1.1、类方法/实例方法
1 | Class A { |
2、函数的参数(可选/默认值/必选)
2.1、基本的函数参数写法
1 | void main() { |
2.2、标记参数为可选/默认值
知识点:
①要设置参数的默认值,只有该参数为可选的时候,才能够设置。
②参数可选的方法有两种,常规的参数加上[],或者使用具名参数
1、常规的参数加上[],标记为可选
1 | void main() { |
2、使用具名参数(named parameters),使得参数为可选
1 | // 具名参数(named parameters)的用法,调用时候具名参数的顺序可以是任意的 |
2.3、如果想告诉用户某个参数是必须的
1 | // 必须参数(如果想告诉用户某个具名参数是必须的,可以使用注解 @require) |
3、回调/函数做参数/返回值
3.1、回调
1 | // 用typedef用于定义函数类型的别名 |
3.2、函数参数
1 | // 用typedef用于定义函数类型的别名 |
4、函数类型
Dart是一个面向对象的编程语言,所以即使是函数也是一个对象,也有一种类型Function,这就意味着函数可以赋值给某个变量或者作为参数传给另外的函数。
1 | printNum(int a) { |
三、类
1、类的定义
1 | class User { |
说明类中的构造方法Person(this.name, this.age, this.gender);的这种语法是Dart比较独特而简洁的构造方法声明方式,它等同于下面的代码:
1 | User(String name, int age, String gender) { |
其他声明成员变量的方法:
1 | // 使用getter/setter声明的成员变量 |
2、类的使用
1 | main() { |
当我们调用一个不存在的方法时,会执行 noSuchMethod() 方法,默认情况下它会抛出 NoSuchMethodError。你也可以重写noSuchMethod(),改成你输出你希望的错误提示
1 | class Test { |
3、类的继承
Dart中使用extends关键字做类的继承。
1 | class Developer extends User { |
虽然 Dart 是单继承的,但它也提供了一定程度的多重继承支持:
使用@override注解声明你要重写的函数,在这个函数内部可以使用super调用重写的这个父类的函数。
1 | class FlutterDeveloper extends Developer { |
mixins
mixins是一个重复使用类中代码的方式,比如下面的代码:
1 | class A { |
四、库
1 | // 用import语句来导入某个包 |
1、问题一:在同一工程中可否有两个同名的类
1 | import 'package:lib1/lib1.dart'; |
2、问题二、如何只允许/只不允许使用某个包中的部分功能
1 | // 只导入lib1中的foo功能 |
五、运算符
1、常见的
| 运算符 | 含义 |
|---|---|
++var |
var=var+1表达式的值为var+1 |
var++ |
var=var+1表达式的值为var |
--var |
var=var-1表达式的值为var-1 |
var-- |
var=var-1表达式的值为var |
++a
a == b
b ? a : b
2、特殊的
2.1、..运算符(级联操作)
使用..调用某个对象的方法(或者成员变量)时,返回值是这个对象本身,所以你可以接着使用..调用这个对象的其他方法。
1 | class Person { |
六、控制流程
| 语句 | 说明 |
|---|---|
| if / else | 略 |
| switch | 略(switch 也支持 String 和 enum) |
| for /while | 略 |
| try / catch | 略 |
1 | // switch语句 |
七、异步
如果一个方法中有耗时的操作,你需要将这个方法设置成async,并给其中的耗时操作加上await关键字,如果这个方法有返回值,你需要将返回值塞到Future中并返回,如下代码所示:
1 | Future<String> checkVersion() async { |
八、其他/奇技淫巧
1、静态成员变量和静态成员方法
1 | // 类的静态成员变量和静态成员方法 |
2、修饰符final和const
final 跟 Java 里的 final 一样,表示一个运行时常量(在程序运行的时候赋值,赋值后值不再改变)。const 表示一个编译时常量,在程序编译的时候它的值就确定了。
| 修饰符 | 作用 |
|---|---|
| final | 一个被final修饰的变量只能被赋值一次, |
| const | 一个被const修饰的变量是一个编译时常量(const常量毫无疑问也是final常量) |
final和const的区别:
区别一:final 要求变量只能初始化一次,并不要求赋的值一定是编译时常量,可以是常量也可以不是。而 const 要求在声明时初始化,并且赋值必需为编译时常量。
区别二:final 是惰性初始化,即在运行时第一次使用前才初始化。而 const 是在编译时就确定值了。
3、泛型
1 | var names = List<String>(); |
附
其他参考文档:

























