flutter dynamic 强大的力量伴随着巨大的责任

14 min read

编译时不会管定义的数据类型 , 运行时才处理变量的类型

关于动态的另一个观点是它不是真正的类型

它是一种关闭类型检查并告诉静态类型系统“相信我,我知道我在做什么”的方法。

写 dynamic o; 声明了一个没有类型的变量——它被标记为“没有类型检查”。

当你写 Object o = something;你是在告诉系统它不能假设任何关于 o 的东西,除非它是一个对象。

您可以调用 toString 和 hashCode 因为这些方法是在 Object 上定义的,但是如果您尝试执行 o.foo() 您将收到警告 - 它看不到您可以这样做,因此它会警告您您的代码可能是错的。

如果你写dynamic o = something,你是在告诉系统不要假设任何东西,也不要检查任何东西。如果你写 o.foo() 那么它不会警告你。你告诉它“任何与 o 相关的东西都可以!相信我,我知道我在做什么”,所以它认为 o.foo() 是可以的。

强大的力量伴随着巨大的责任

如果您禁用变量的类型检查,则需要您确保您没有做错任何事情。

不要使用 List.from(),除非你想要更改结果的类型

如果使用 List.from 方法的话,如果不指定泛型类型,会抹除集合的类型,变成 dynamic

var list = ['a', 'b'];
 
var copy1 = list.toList();
var copy2 = List.from(list);
 
print(copy1.runtimeType);  // List<String>
print(copy2.runtimeType);  // List<dynamic>

运行进显示动态类型

dynamicDemo() {
  dynamic d = "test";

  // 打印 dynamic 变量的运行时类型
  print(d.runtimeType);
  // 打印 dynamic 变量值
  print(d);

  // 调用 dynamic 变量的方法, 静态编译时无法检查其中的错误, 运行时会报错
  //d.getName();

  // 为 dynamic 变量赋值 int 数据
  d = 666;
  // 打印 dynamic 变量的运行时类型
  print(d.runtimeType);
  // 打印 dynamic 变量值
  print(d);
}

main() {
  dynamicDemo();
}


//String
//test
//int
//666