变量声明
关键字 var
通过 var 声明一个变量,如果这个变量在声明时赋值了,此时类型就已经确定了,再次赋值时不能更改其他类型。
var str = "hello dart";
// 因为声明时已经赋值为String,所以不能更改类型
str = 3; // 编译器会报错
str = "nihao"; //再次赋值只能为String类型
因为 Dart 本身是一个强类型语言,任何变量都是有确定类型的,在 Dart 中,当用var声明一个变量后,Dart 在编译时会根据第一次赋值数据的类型来推断其类型,编译结束后其类型就已经被确定。
关键字 dynamic和Object
Object是Dart所有对象的基类,就是说在 Dart 中所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象。 dynamic与Object声明的变量都可以赋值任意对象,且后期可以改变赋值的类型,这和 var 是不同的,如:
dynamic str = "hi dart!";
str = 4;
Object src = 34.32;
src = "nihao";
这样赋值时没有任何问题的,这时候有人会问,既然用 dynamic 和 object 都可以让变量赋值任何类型,那么这两个有什么区别呢?
**dynamic **与 **Object **不同的是 **dynamic **声明的对象编译器会提供所有可能的组合,而 **Object **声明的对象只能使用 Object 的属性与方法, 否则编译器会报错,如:
dynamic a = "hi dart!";
Object b = "nihao";
// 正常打印 值为8
print(a.length);
// 报错
print(b.length);
用Object修饰的变量b,不能使用length属性,因为Object对象并没有这个属性,而用dynamic修饰的变量a,赋予了String类型的属性和方法,所以可以使用length属性。
但是这里有个点需要注意 :dynamic修饰的变量a,使用a.length没有报错,而且能正常打印值,是因为 a 被赋值为String 类型,而String类型有length这个属性,但是如果我们把length改成其他String类型没有的属性,比如随便写一个不存在的属性:
print(a.ccccc); // a是字符串,没有"ccccc"属性,编译时不会报错,运行时会报错
这样写在编译期不会报错,但运行时会报错,这一点要注意。
关键字 final和const
final 和const 都是修饰一个不可变的变量,一个final变量只能被设置一次,两者区别在于:const 变量是一个编译时常量(编译时直接替换为常量值),final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略,如:
//可以省略String这个类型声明
final str = "hi dart";
//final String str = "hi dart";
const str1 = "hi dart";
//const String str1 = "hi dart";
空安全(null-safety)
Dart 中一切都是对象,这意味着如果我们定义一个数字,在初始化它之前如果我们使用了它,假如没有某种检查机制,则不会报错,比如:
test() {
int i;
print(i*8);
}
在 Dart 引入空安全之前,上面代码在执行前不会报错,但会触发一个运行时错误,原因是 i 的值为 null 。但现在有了空安全,则定义变量时我们可以指定变量是可空还是不可空。
由于空安全机制,将运行时的错误提前到编译期,这样在我们对这个变量操作时,提前发现这个变量是否为空,从而避免运行时崩溃。
int i = 8; // 默认不为空,使用前必须初始化
int? j; // 定义为可空类型,对于可空变量,我们在使用前必须判空。
// 如果我们预期变量不能为空,但在定义时不能确定其初始值,则可以加上late关键字,
// 表示会稍后初始化,但是在正式使用

本文介绍了Dart编程中的变量声明,包括var、dynamic、Object的区别,以及final和const的使用。详细阐述了Dart的空安全机制,展示了如何处理可空类型。此外,还讲解了Dart中的列表、映射、函数以及可选参数的使用。最后,深入探讨了异步编程,包括Future和Stream的概念以及async/await的运用,帮助理解Dart中的异步处理方式。
最低0.47元/天 解锁文章
Dart基本语法&spm=1001.2101.3001.5002&articleId=125816948&d=1&t=3&u=e145c2a8d5a747c8924bdbc1a8e2a17d)
1191

被折叠的 条评论
为什么被折叠?



