一:变量
Flutter中没有基本数据类型,全部为Object类型,所以未初始化的变量值为null。
Object
Object是所有类的基类,Object声明的变量可以是任意类型。int、String、bool等等都是Object类型。
Object obj = "变量";
Object i = 1;
i = true;
i = "sss";
var
var关键字:在声明变量赋值时决定它的类型
(官方建议用var,但是缺点不能一眼看出是什么类型,具体使用看个人习惯)
var j = "文案";//此时j变量已经声明赋值为String了
j = 10;//❌后续不能修改类型
var s;//只声明变量,没有赋值,所以默认类型变成了"null",也就是object类型。
s = "aaa";//所以后续可以赋值int和string
s = 10;
dynamic
dynamic关键字:动态类型,在运行时才确定类型,效率较低。
dynamic d = "dynamic";
d = 10;
final和const
final:运行时常量
//final使用等同于Java中的final,可以不设置类型
final int fi1 = 1;
fi1 = 2;//❌常量不能再次赋值
final fi2 = 1;
const:编译器常量
//const使用,可以不设置类型
const int ci1 = 1;
ci1s = 2;//❌常量不能再次赋值
const ci2 = 1;
final和const的区别
- final是运行时常量,效率较低。const是编译期常量,效率略高。
- 全局变量可以使用final修饰,但是不能使用const。如果const修饰全局变量,需要定义为static const静态常量。
- const不能被final修饰的常量赋值,因为const在编译期赋值,final在运行期赋值,const在前。
/**
* const不能被final修饰的常量赋值,因为const在编译期赋值,final在运行期赋值,
* const在前。
* 感觉像是这样:
* final String demo = "测试";
* static final String demo1 = demo;//❌静态调用非静态
*/
const ci3 = fi1;//❌报错const在前,final在后
//const赋值const,同一时期,可以赋值
const ci4 = ci1;
//final赋值const,const在前,final在后,可以赋值
final fi3 = ci4;
二:内置类型
num类型
num是数字类型的父类,有两个子类int和double。
Dart中int类型可以当做java中的short、int、long使用,如果我们赋值的变量长度超过4个字节,dart就会编译成类似于long,否则就是类似short或者int。double也是如此。
String类型
使用单引号或者双引号来创建字符串,单引号和双引号可以嵌套使用,否则需要使用\进行转义。字符串中也可以引用变量与表达式。
/**
* Dart字符串 支持单引号,双引号嵌套使用
*/
String str = "\"双引号声明字符串,\"";//需要转义
String s = '"单引号声明字符串"';//嵌套使用时,打印""无需转义
String s1 = "'单引号声明字符串'";//嵌套使用时,打''无需转义
/**
* 字符串拼接
* Dart中支持使用+拼接字符串。
* 也可以使用$进行变量拼接
* 字符串中也可以引用变量与表达式。
*/
int num = 8;
//String all = String.format("%s%d", "", 1);//Java中字符串拼接形式
String all1 = "${str.substring(0, 1)}我还能撸${num}次";//Dart中
String all2 = str + all1;
/**
* 多行字符串
* Dart中使用三单引号或三双引号支持多行字符串
*/
String s2 = """三引号支持多行字符串
换行了6666
我又换行了""";
/**
* 字符串换行
* 字符串想显示\n,有两种方式:
* 第一种:\转义
* 第二种:r前缀
*/
String r = "\\n使用转义方式输出\\n换行符";
String r1 = r"\n使用前缀r方式输出\n换行符";
布尔类型
Dart中布尔类型为bool,可以赋值为true或false(也可以赋值为null)。要注意的是Dart中全部都是Object类型的,所以bool类型如果不赋值,默认值为null。
bool b = true;
bool b = false;
bool b = null;
List
创建、增删改查、遍历
/**
* List数组
* 创建List数组的方式
*/
List<String> list = new List();
var list1 = List();//可以不写new关键字,看个人习惯
List<String> list2 = ["a", "b", "c", "d"];
//查:类似数组通过下表查询 元素
String vlaue = list2[0];
//删
list2.removeAt(0);
//改
list2[0] = "修改";
//增加
list2.add("增加");
//遍历
//iter模板
for (var i in list2) {}
//itar模板
for (var j = 0; j < list2.length; ++j) {}
const修饰List
/**
* const修饰list对象,表示list对象不可变
* const 修饰["a","b","c"]后,后续不可增删改查。
* 但是可以修改引用指向。
*/
List<String> list3 = const["a", "b", "c"];
//list3.add("d");//❌ 运行时报错
list3 = ["A1", "A2", "ASD"];//可以修改引用指向。
/**
* const修饰引用,既不能修改引用,也不能修改值
*/
const List<String> list4 = ["a", "b", "c"];
//list4 = ["a", "b", "c"];//❌ 编译时报错
//list4.add("d");//❌ 运行时报错
Map集合
创建、增删改查、遍历
/**
* map集合
* 创建map集合的方式
*/
Map<String, String> map = new Map();
var map1 = Map();//可以不写new关键字,看个人习惯
Map<String, String> map2 = {"k1":"v1", "k2":"v2", "k3":"v3"};
//增
map2["k4"] = "v4";
//删除
map2.remove("k2");
//改
map2["k3"] = "修改value";
//查
map2["k1"];
print(map2["k99"]);//查询一个不存在的key,返回null
//迭代器遍历
var keys = map2.keys;//迭代器
for (var value in keys) {
print(value);//key
}
const修饰Map
const声明Map,同上List例子
Runes
用于在字符串中表示Unicode字符
Symbols
操作符标识符,可以看作C中的宏。表示编译时的一个常量
var sym = #F;
switch(sym) {
case #SD:
break;
case #F:
break;
}
三:操作符
as 类型转换操作符
Dart中不支持强转类型,可以使用as操作符进行类型转换。
String s = "str";
int i = (int)s;//❌ Dart中不支持强转
//类型转换
int i1 = s as int;
is、is! 类型判断操作符
Dart中不支持 instanceof来进行类型判断,可以is、 is!进行类型判断。
//Dart中不支持 instanceof
//判断属于String类型
if(i1 is String) {
}
//判断不属于String类型
if(i1 is! String) {
}
??= 赋值操作符
判断是否为null,为空则赋值。
/**
* ??=: 赋值操作符
*/
Object demo;
if(demo == null) {
demo = 234;
}
//此写法意思同上
demo ??= 234;
?? 条件表达式
/**
* ?? :条件表达式
* 前一个不为空,执行第一个.反之则执行后一个.
*
* 伪代码:
* demo !=null ? demo : "";
*/
var v = demo??"after";
… 级联操作符
/**
* .. :级联操作符, 简化构建者模式
*/
new Builder()
..url()
..placeHolder()
..build();
class Builder {
void url() {
}
void placeHolder() {
}
void build() {
}
}
?. 安全操作符
/**
* ?. :安全操作符
*/
String str;
//如果str为null,则返回null,不会报错
print(str?.length);