Dart语法学习-变量

一、 创建Dart File

 Hello, World

void main() {
  print('Hello world');
}


Log:
Hello world

二、变量

1.Dart 支持类型推断。

  var name = 'Voyager I';
  var year = 1977;
  var antennaDiameter = 3.7;
  var flybyObjects = ['A1', 'A2', 'A3', 'A4'];
  var image = {
    'tags':['saturn'],
    'url':'www.baidu,com'
  };
void main() {
  var number = 42;
  printInteger(number);
}

void printInteger(int aNumber) {
  print('The number is $aNumber');
}

Log:
The number is 42

创建变量并对其进行初始化

var name = 'Bob';

 上面的例子中name 变量的类型被推断为 String,但可以通过指定它的类型来更改确认类型。

Object name = 'Bob';

显式声明将被推断的类型

String name = 'Bob';

2.默认值

可空类型的未初始化变量的初始值为空。

void main() {
  int? lineCount;
  print(lineCount == null);
}

Log:
true

错误使用

注意:不可空类型需要在使用前初始化。

void main() {
  int lineCount;
  print(lineCount == null);
}

31:9: Error: Non-nullable variable 'lineCount' must be assigned before it can be used.
  print(lineCount == null);
        ^^^^^^^^^

不可空变量必须在使用之前初始化它们的值。

int lineCount = 0;

注意:

不必在声明局部变量的地方对其进行初始化,但需要在使用前为其赋值。

void main() {
  int lineCount;
  lineCount = 1;
  print(lineCount);
}

Log
1

 变量被延迟初始化; 初始化代码在第一次使用变量时运行。

3.Late变量

late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}

Log
Feijoada!

Dart 2.12 添加了 late 修饰符

  • 声明一个在声明后初始化的不可空变量。
  • 延迟初始化变量。

注意:如果未能初始化延迟变量,则在使用该变量时会发生运行时错误。

late String description;

void main() {
  //description = 'Feijoada!';
  print(description);
}

Log
Unhandled exception:
LateInitializationError: Field 'description' has not been initialized.
#0      description (file:///D:/androidmyproject/MyProject/MyApplication/app/src/main/java/com/example/myapplication/flutter/TestDart.dart)
#1      main (file:///D:/androidmyproject/MyProject/MyApplication/app/src/main/java/com/example/myapplication/flutter/TestDart.dart:44:9)
#2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#3      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:26)

 

当将变量标记为延迟( late )但在其声明时对其进行初始化时,初始化程序将在第一次使用该变量时运行。

  • 该变量可能不需要,并且初始化它的成本很高。
  • 正在初始化一个实例变量,它的初始化器需要访问它。
// This is the program's only call to readThermometer().
late String temperature = readThermometer(); // Lazily initialized.

4.final 和 const

如果从不打算更改变量,请使用 final 或 const 代替 var 使用。 final 变量只能设置一次; const 变量是编译时常量。 (const 变量是隐式最终的。)

注意:实例变量可以是 final 但不是 const。

final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';

不能修改final变量的值

void main() {
  final a = 1;
  a = 2;
}

Log
TestDart.dart:49:3: Error: Can't assign to the final variable 'a'.
  a = 2;
  ^

const声明编译时常量的变量。 如果 const 变量在类级别,则将其标记为 static const。 在声明变量的位置,将值设置为编译时常量,例如数字或字符串文字、const 变量或对常量进行算术运算的结果:

void main() {
  const bar = 1000000; // Unit of pressure (dynes/cm2)
  const double atm = 1.01325 * bar; // Standard atmosphere
  print(atm);
}

Log
1013250.0

const 关键字不仅仅用于声明常量变量。 还可以使用它来创建常量值,以及声明创建常量值的构造函数。 任何变量都可以有一个常量值。

var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`

 const 声明的初始化表达式中省略 const,例如上面的 baz。可以更改非 final、非常量变量的值,即使它曾经有一个 const 值:

void main() {
  var foo = const[];
  foo = [1, 2, 3];
  print(foo);
}

Log
[1, 2, 3]

不能更改 const 变量的值

void main() {
  const baz = [];
  baz = [1, 2, 3];
}

Log
TestDart.dart:66:3: Error: Can't assign to the const variable 'baz'.
  baz = [1, 2, 3];
  ^^^

 

 可以定义使用类型检查和强制转换(is 和 as)、集合 if 和传播运算符(... 和 ...?)的常量

void main() {
  const Object i = 3; // Where i is a const Object with an int value...
  print(i);
  const list = [i as int]; // Use a typecast.
  print(list);
  const map = {if (i is int) i: 'int'}; // Use is and collection if.
  print(map);
  const set = {if (list is List<int>) ...list}; // ...and a spread.
  print(set);
}

Log
3
[3]
{3: int}
{3}

注意:虽然无法修改final修饰的对象,但可以更改其字段。 相比之下,const 对象及其字段不能更改:它们是不可变的。

猜你喜欢

转载自blog.csdn.net/zhangying1994/article/details/128813611