跳到主要内容

flutter基础语法:变量

1. 定义

 程序运行过程中的数据会存放在内存的某个地址上,变量是内存地址的名称,通过变量可以获取到对应的数据或者对数据进行修改。下面例子声明并初始化一个变量。

var name = 'Bob';

var声明的变量没有指定变量的类型,但编译器会推导出变量的类型,并进行替换,所以下面的代码无法通过编译。

import 'package:flutter/material.dart';

void main() {
var test = "abc";
print(test);
test=1; //test的类型已经是String
print(test.runtimeType);//打印test的类型
}

 声明变量时,可以显式的指定变量的类型。例如:

String name = 'Bob';

2. Object和dynamic

 如果并不限制变量的类型,可以使用Object或者dynamic。例如:

void main() {
Object test = "abc";
print(test);
test = 1;
print(test);

dynamic test2 = "def";
print(test2);
test2 = 1;
print(test2);
}

dynamic并不是一种类型,编译器不会进行类型检查。Object是一种类型,编译会进行类型检查。下面的代码无法通过编译。

void main() {
dynamic a = 2;
Object b = 2;

print(a.length);//编译成功
print(b.length);//编译错误
}

 没有初始化的变量的默认值为null,因为 Dart 里所有的类型都是对象,所以数值类型的默认值也是null

void main() {
int? a;
print(a);
}

提示

Dart 支持 null safety ,即变量不能为 null,如果希望变量能为 null ,在变量类型后面加上?

3. late关键字

 因为null safetyDart 会分析代码流程,确保变量在使用之前被赋予了一个非空值。但有些时候分析会失败,即使变量已经被赋予了非空值,编译器还是提示变量不能为空。Dart 2.12加入了late关键字,告诉编译器这个变量非空。

late String description;

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

late关键字还意味着懒加载。如果在声明late变量时进行了初始化,那么初始化会推迟到变量第一次使用时执行。如果变量没有被使用,则初始化不会执行。

4. final和const

 如果在代码执行过程中不允许改变变量,可以使用final或者const修饰变量。final的变量只能赋值一次(不要求在声明时),const变量必须是编译时常量(const变量默认是final)。

final name = 'Bob'; // Without a type annotation
name = 'Alice'; // Error: a final variable can only be set once.

const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere

finalconst的区别在于:final仅仅限制被final修饰的变量不能二次赋值,但变量里的内容是可以修改的,例如:

void main() {
final a = [1, 2, 3];
a.add(4);
print(a);
}

 如果将修饰符从final换成const,运行时会报错。



  1. What is the difference between dynamic and Object in dart?

  2. language-tour

  3. What is the difference between the "const" and "final" keywords in Dart?

署名-非商业性使用-禁止演绎 4.0 国际