dart基础
dart文件命名是小写字母和下划线组成,没有基本数据类型一切皆对象,和很多语言一样是main方法为入口方法
支持顶部函数
void main(){
print('aa');
}
内置的类型
与Java的八大内置基本数据类型不同,Dart 内置支持下面这些类型:
- numbers
- strings
- booleans
- lists (也被称之为 arrays)
- maps
- runes (用于在字符串中表示 Unicode 字符)
- symbols
变量的定义
变量命名有好几种方式可以
void main(){
Object f="";///和java一样任何类默认都继承Object
String a="";///可以和koltin一样通过${} 来拼接字符串
bool bl=false;///布尔类型 与java类似
///int 和 double 都是num的子类
int b=0;///dart中没有long类型 但会根据实际的值得大小 来在不同平台转换成对应的值
///例如:如果你写的范围超出了java中的int 在android平台就会自动变成long类型
double c=0.0;///double和上面类似
var d="";///如果声明的时候没有赋值,之后可以随便改变类型,但是如果声明的时候赋值了就会直接确定其类型
dynamic e="";///这个类型会动态确定值得类型,也就是在运行时才会确定类型,声明了可以随意改变类型的,
///如果确定类型的话不建议使用它
}
final 和const区别
final 是运行时确定的常量,const是编译时就确定的常量 可以提高效率
static
static 和java类似
List和Map
和java不同 List和Map不是接口,可以直接使用
Map和koltin类似通过中括号 赋值
List获取值也和koltin类似通过中括号获取
不过提供的api比较丰富
List<String> list=List();
list.add("这是第一条");
Map<String,String> map=Map();
map["a"]="a";
循环控制语句
循环: for foreach while do while
List<String> list=List();///dart可以省略new关键字
list.add("这是第一条");
list.add("这是第二条");
list.add("这是第三条");
list.add("这是第四条");
for (var i = 0; i < list.length; ++i) {
print(list[i]);
}
list.forEach((s) {
print(s);
});
int a=0;
while(a<list.length){
print(list[a]);
a++;
}
int b=0;
do{
print(list[b]);
b++;
} while(b<list.length);
操作符
- 类型转换:as
- 判断类型:is
- =、+=、=、*=这些不必多说,还有一个 ??= 操作符用来指定 值为 null 的变量的值
- 安全操作符:?. 表示这个对象不为null才会执行和koltin一样
- 三目运算符 :String a=1>2?"a":"b"; 和java一样
- 级联操作符使用 .. 的范式调用方法可以达到java中建造者的效果
String a=1>2?"a":"b";
a..length..toString();
方法
在dart中方法是不能重载的,但是dart为我们提供了可选位置参数,和可选命名参数两种
- 可选位置参数,中括号内要赋值就要按照顺序赋值,不能跳过某个参数
void test(String s,[String a="a”,String b]){///可以在中括号中赋予默认中
}
- 可选命名参数,大括号内的参数可以选择性的赋值
void test(String s,{int a=0,String c=""}){///可以在大括号中赋予默认中
}
一等方法对象
在dart 中方法可以代表接口,使用时可以写成匿名方法,例如
void main(){
fu((t){
print(t);
});
}
void fu(void t(String t)){///void t(String t) 这个作用相当于一个接口
t("你好");
}
但是这样写感觉看着很乱我们来改一下
void main(){
fu((t){
print(t);
});
}
void fu(Function t){///Function 声明一个方法一个方法
t("你好");
}
但是这样我们就看不到需要传递的参数了 这里我们就要借助typedef这个关键字
void main(){
fu((t){
print(t);
});
}
void fu(call_back c){
c("你好");
}
typedef call_back(String t);
这样我们就可以名确定知道需要传递的参数
异常
和 Java 不同的是,所有的 Dart 异常是非检查异常。 方法不一定声明了他们所抛出的异常, 并且不要求你捕获任何异常。
Dart 提供了 Exception和Error 类型, 以及一些子类型。你还 可以定义自己的异常类型。但是, Dart 代码可以 抛出任何非 null 对象为异常,不仅仅是实现了 Exception 或者Error 的对象。
可以捕捉指定类型异常
try {
throw 123;
} on int catch(e){
//使用 on 指定捕获int类型的异常对象
} catch(e,s){
//函数 catch() 可以带有一个或者两个参数, 第一个参数为抛出的异常对象, 第二个为堆栈信息 ( StackTrace 对象)
rethrow; //使用 `rethrow` 关键字可以 把捕获的异常给 重新抛出
} finally{
}
类
类的创建和使用都和java差不多,但是dart中并没有权限修饰符,只有一个下划线代表私有。首字母是下划线代表这个类、方法、属性不能被其他文件访问,dart是支持反射的,但是flutter中将dart的反射屏蔽掉了,所以在flutter开发中也就不能通过反射来操作。
构造方法
class Test {
Test() {///普通构造方法和java一样 但是不能重载
}
factory Test(){///工厂构造方法 这里会报错,原因是方法不能重载
}
}
实现单例有两种方式
- 和java一样的做法 输出为true可以知道两次调用的Test.intance是同一个对象
void main() {
print(Test.intance().hashCode==Test.intance().hashCode);
}
class Test {
static Test test;
static intance(){
return test??=new Test();
}
}
- dart中为我们提供了工厂构造函数,我们可以使用工厂构造函数来实现,输出也为true,我们可以知道我们每一次创建新对象的时候并没有创建 还是第一次创建的对象,实现了单例
void main() {
print(Te().hashCode==Te().hashCode);
}
class Te {
int a=0;
Te._intance(){
a=1;
}
static Te te;
factory Te(){
return te??=Te._intance();
}
}