在 Dart 中,dynamic 和 Object 的有什么区别?

dynamic 和 Object 都可以用来定义可以被赋予任何值的对象。但是它们俩到底有什么区别呢?

静态类型检查

dynamic 和 Object 最大的区别是 dynamic 会关闭静态类型检查,也就是说类型为 dynamic 的变量可以调用任何方法,但是类型为 Object 的变量,只能调用 Object 本身有的方法。

dynamic a = 'This is A';
Object b = 'This is B';

print(a.length); // Okay
print(b.length); // The getter 'length' isn't defined for the type 'Object'.

null 值

dynamic 变量可以支持赋予它任何值,包括 null。但是 Object 变量不能赋值为 null,也就是说 Object 可以被赋予除 null 以外的所有值。

(备注:null 是 Null 类的唯一实例对象,同时 Null 类是 Flutter 中唯一个不继承与 Object 的类)

dynamic a = 'This is A';
Object b = 'This is B';

a = null; // Okay
b = null; // A value of type 'Null' can't be assigned to a variable of type 'Object'.