Dart中的变量与常量

250 阅读3分钟

变量

弱类型

  1. var
  • 如果没有初始值,可以变成任何类型
var a;
a = 'abc';
a = 123;
a = ['abc'];
  • 一旦初始赋值,就确定类型,不能随意改动
var a = 'abc';
a = 123; // A value of type 'int' can't be assigned to a variable of type 'String'.
  1. Object 动态任意类型,编译阶段检查类型
Object a = 'abc';
a = 123;
a = [222];
a.p(); // The method 'p' isn't defined for the type 'Object'.
  1. dynamic 动态任意类型, 编译阶段不检查检查类型
dynamic a = 'doucafecat'; 
a = 123; 
a = [1111]; 
a.p();

总结:var如果有初始值,类型被锁定。Object在编译时检查类型,dynamic不在编译时检查类型。

强类型

  1. 声明后,类型被锁定
String a;
a = 'abc';
a = 123; // A value of type 'int' can't be assigned to a variable of type 'String'.
  1. 常见类型 | 名称 | 说明 | | ---- | ---- | | num | 数字 | | int | 整型 | | double| 浮点 | | bool | 布尔 | | String | 字符串 | | StringBuffer | 字符串buffer | | DateTime | 时间日期 | | Duration | 时间区间 | | List | 列表 | | Sets | 无重复队列 | | Maps | kv容器/字典 | | enum | 枚举 |

默认值

var、dynamic变量声明后默认是null, 其他的类型必须得初始化后才能使用。

var a;
print(a); // null

dynamic d;
print(d); // null

Object c;
print(c); // The non-nullable local variable 'c' must be assigned before it can be used.
String b;
print(b); // Non-nullable variable 'b' must be assigned before it can be used.

int e;
print(e); // The non-nullable local variable 'a' must be assigned before it can be used.

使用场景

  1. var可以简化定义变量 不明确变量类型时
var map = <String, dynamic>{}; // 如果不使用var, 则需要写成 Map<String, dynamic> map = <String, dynamic>{};
  1. 查询参数定义 例如在api查询通用接口的封装时,一般使用动态类型
Future<Response<T>> get<T>(
	String path, {
		Map<String, dynamic> queryParams,
		...
	}
)
  1. 在实例对象的定义时,一般使用明确类型
class People {
	int ID;
	int age;
	String name;
	People({this.ID, this.age, this.name});
	...
}

常量

在dart中使用final和const定义常量

  1. final与const的共同点有
  • 类型声明可以省略
final String a = 'abc';
final b = 'abc';

const String c = 'abc';
final d = 'abc';
  • 初始值后不能再赋值
final a = 'abc';
a = '123'; // The final variable 'b' can only be set once.

const b = 'abc';
b = '123'; // Constant variables can't be assigned a value.
  • 不可与var同时使用
final var a = 'abc'; // Members can't be declared to be both 'final' and 'var'.
const var a = 'abc'; //  Members can't be declared to be both 'var' and 'const'.
  1. final与const的不同点有
  • const需要确定的值
final a = DateTime.now();

const b = DateTime.now(); // The constructor being called isn't a const constructor.
  • const里面的数据不能修改
final ls = [1, 2, 3];
ls[1] = 4;

const l = [4, 5, 6];
l[1] = 7; // UnsupportedError (Unsupported operation: Cannot modify an unmodifiable list)
  • const在内存中不会重复创建
final a1 = [11, 22];
final a2 = [11, 22];
print(identical(a1, a2)); // false

const b1 = [11, 22];
const b2 = [11, 22];
print(identical(b1, b2)); // true

identical 通过比较两个引用的是否是同一个对象判断是否相等

使用场景

  1. final 成员变量初始值
class EmptyView extends StatelessWideget {
	final String? content;
	final String? imagePath;
}
  1. const全局参数
static const FirstOpenApp = 'first_open_app';
static const AppBaseUrl = 'https://....';