dart语言基本介绍及基本语法
关于作者: CSDN内容合伙人、技术专家, 从零开始做日活千万级APP,带领团队单日营收超千万。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业化变现、人工智能等,希望大家多多支持。
目录
- 一、导读
- 二、概览
- 三、简介
-
- 3.1 var 关键字
- 3.2 dynamic 和 Object
- 3.3 final 和 const
- 3.4 空安全(null-safety)
- 3.5 函数声明
- 3.6 函数作为变量
- 3.7 函数作为参数
- 3.8 可选的位置参数
- 3.9 可选的命名参数
- 3.10 mixin
- 四、Future 异步支持
-
- 4.1 Future.then
- 4.2 Future.catchError
- 4.3 Future.whenComplete
- 4.4 Future.wait
- 4.5 async/await
- 五、 Stream
- 六、 推荐阅读
一、导读
我们继续总结学习flutter基础知识,温故知新。
本文主要介绍dart语言的基础知识。
二、概览
Dart 在静态语法方面和 Java 非常相似,如类型定义、函数声明、泛型等,
而在动态特性方面又和 JavaScript 很像,如函数式特性、异步支持等。
除了融合 Java 和 JavaScript 语言之所长之外,Dart 也具有一些其他很有表现力的语法,
如可选命名参数、…(级联运算符)和?.(条件成员访问运算符)以及??(判空赋值运算符)
三、简介
Dart 本身是一个强类型语言,任何变量都是有确定类型的
3.1 var 关键字
Dart 中 var 关键字,可以声明一个变量,并赋予一个初始值,
可以接收任何类型的变量,Dart 中 var 变量一旦赋值,类型便会确定,则不能再改变其类型
var t = "hi world";
// 下面代码在dart中会报错,因为变量t的类型已经确定为String,
// 类型一旦确定后则不能再更改其类型。
t = 1000;
对于变量的声明,也可显式的声明类型,比如:
var name = 'Alice'; // 自动推断类型为 String
int age = 25; // 显式声明类型
3.2 dynamic 和 Object
dynamic 和 Object可以声明一个变量,并赋予一个初始值
Dart 中所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象。
dynamic与Object声明的变量都可以赋值任意对象,且后期可以改变赋值的类型
dynamic t; //声明的对象编译器会提供所有可能的组合
Object x; //声明的对象只能使用 Object 的属性与方法, 否则编译器会报错
t = "hi world";
x = 'Hello Object';
//下面代码没有问题
t = 1000;
x = 1000;
dynamic 的这个特点使得我们在使用它时需要格外注意,这很容易引入一个运行时错误,比如下面代码在编译时不会报错,而在运行时会报错:
print(a.xx); // a是字符串,没有"xx"属性,编译时不会报错,运行时会报错
3.3 final 和 const
final 关键字声明的变量,只能被赋值一次,且类型不能改变,
const 关键字声明的变量,只能被赋值一次,且类型不能改变,且编译时确定,不能在运行时改变。
//可以省略String这个类型声明
final str = "hi world";
//final String str = "hi world";
const str1 = "hi world";
//const String str1 = "hi world";
3.4 空安全(null-safety)
int i = 8; //默认为不可空,必须在定义时初始化。
int? j; // 定义为可空类型,对于可空变量,我们在使用前必须判空。
// 如果我们预期变量不能为空,但在定义时不能确定其初始值,则可以加上late关键字,
// 表示会稍后初始化,但是在正式使用它之前必须得保证初始化过了,否则会报错
late int k;
k=9;
如果一个变量我们定义为可空类型,在某些情况下即使我们给它赋值过了,
但是预处理器仍然有可能识别不出,这时我们就要显式(通过在变量后面加一个”!“符号)告诉预处理器它已经不是null了,比如:
class Test{
int? i;
Function? fun;
say(){
if(i!=null) {
print(i! * 8); //因为已经判过空,所以能走到这 i 必不为null,如果没有显式申明,则 IDE 会报错
}
if(fun!=null){
fun!(); // 同上
}
}
}
上面中如果函数变量可空时,调用的时候可以用语法糖:
fun?.call() // fun 不为空时则会被调用
3.5 函数声明
Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。
这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
// 对于只包含一个表达式的函数,可以使用简写语法:
bool isNoble (int atomicNumber)=> true ;
// Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic处理
// 不指定返回类型,此时默认为dynamic,不是bool
isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
typedef bool CALLBACK();
//不指定返回类型,此时默认为dynamic,不是bool
isNoble(int atomicNumber) {
return