注:此篇文章对应有一定开发语言基础的伙伴学习研究。这里只摘录出Dart的特性和其它语言不一样的特性(对比java)。
简介:Dart访问控制、Dart公有私有、Dart属性定义、Dart方法、Dart数据类型、Dart运算符、Dart=>函数、Dart箭头函数、Dart 构造、Dart get/set、Dart:函数、Dart冒号函数、Dart包/类冲突
在Dart中,访问控制只有两种即:公有和私有;但是并不存在修饰符。
无论是属性还是方法,默认为公有;在属性名或方法名前加下划线为私有距离举例
举例 | 说明 |
String str; | 定义一个公有的字符串属性 |
String _str; | 定义一个私有的字符串属性 |
void getStr(){} | 定义一个公有的方法 |
void _getStr(){} | 定义一个私有的方法 |
以上可以看出,公有和私有并没有修饰符,只在于名字前的 "_" 。
在Dart中,可以使用关键字 ‘var’ 定义一个变量。那么有人问了, 这个var定义的变量是什么类型呢?
Dart 可以 根据值自动推断类型。当然,我们也可以直接指定变量类型。
举例 | 说明 |
var str = ‘你好 !’; | 推断 str 为String 类型 |
var str = 123; | 推断 str 为String int类型 |
var str = 123; str = ‘456’; |
注意:次例句str会被推断为int类型,下边改变str值为String类型。 结果是:会 报 错。 |
String str; | 定义一个String变量名称为srt |
int str; | 定义一个int变量名称为srt |
在Dart中,定义常量有两个关键词 const 和 final。
这两个关键字相同点在于:使用任意一个关键字修饰的属性都不个改变
不同点在于:final 可以开始不赋值但只能赋值一次。final 不仅有const编译时常量的特性,最重要的它是运行时常量。并且final是惰性初始化的,即在运行时第一次使用前才初始化。
举例 | 说明 |
const a = '你好!'; | 使用const 定义一个常量 |
const a = '你好!'; a = 'Hello !!'; |
试图修改一个常量的值 结果是:会 报 错。 |
final a = '你好!'; | 使用final 定义一个常量 |
final a = '你好!'; a = 'Hello !!'; |
试图修改一个常量的值 结果是:会 报 错。 |
const time = new DateTime.now(); | 使用const定义一个运行时 返回结果的常量 结果是:会 报 错。 |
final time = new DateTime.now(); | 使用final定义一个运行时 返回结果的常量 |
在Dart中,定义一个方法可省略返回值类型。如无需返回值可使用void。
举例 | 说明 |
getStr(){}; | 具有返回值的 方法 |
void getStr(){}; | 没有返回值的 方法 |
String getStr(){}; | 返回String类型的方法 |
getStr(){ getName(){ return ''; } }; |
在dart中,方法是可以嵌套的。有称为 闭包 |
getInfo(String name,int age){}; | 带参数的方法 |
getInfo(String name,[int age]){}; | age为 可选参数,调用此方法时可以不传这个参数 |
getInfo(String name,[int age,String sex = '男']){}; | age为 可选参数,sex 为默认参数,当不传入sex时,sex默认为男 |
getInfo(String name,{int age}){}; | 命名参数,调用此方法时getInfo('秀儿',age:15); |
var aa = (){} | 匿名方法 赋给一个变量 aa |
在Dart中,常用数据类型有String,数值(int、double),运算符,boo,数组集合(List、map)。
字符串在Dart中使用时要在变量名前加 ‘$’ 符号
举例 | 说明 |
String str = '你好!!'; String str = "你好!!"; String str = '''你好!!'''; String str = """你好!!"""; |
dart可以使用 一个单引号、一个双引号、三个单引号、三个双引号定义String变量。
|
String str = '''你好!! 我好!! 大家好!!'''; |
三个单引号和三个双引号定义变量时,可以有回车,并且控制台输出时与定义变量时格式一致。 |
String str = '你好!!'; print('$str'); |
定义并打印字符串 |
变量定义例句:
int i = 123;
double b = 123.3;
bool 值只有两个,true或false
forEach遍历
list.forEach((value){
print('$value');
});
where 条件返回集合。返回满足条件数据生成新的集合
var list = [1,2,3,4,5,6,7,8];
var listTo = list.where((value){
return value > 5
});
any条件返回bool值。集合任意元素满足条件返回true。下边代码返回true;
var list = [1,2,3,4,5,6,7,8];
var listTo = list.any((value){
return value > 5
});
every条件返回bool值。集合每个元素满足条件返回true。下边代码返回false;
var list = [1,2,3,4,5,6,7,8];
var listTo = list.every((value){
return value > 5
});
举例 | 说明 |
var list = ['aaa','bbb','ccc','ddd']; | 定义List数组 |
var list = new List(); | 定义List数组 |
var list = new List |
定义String类型数组 |
举例 | 说明 |
var map = { "name":"张三", "age":20 }; |
定义Map数组 |
var map = new Map(); | 定义Map数组 |
举例 | 说明 |
var str = 'aaa'; bool b = str is String; |
使用 is 关键字判断类型 判断变量str是否为String类型,返回true; |
isNaN | int i = 0/0; 上句再别的语言中报错,但在dart中并不会报错,二十返回NaN。 isNaN就是判断变量 是否时 NaN |
isEmpty | 判断时否为空 |
isNotEmpty | 判断时否不为空 |
算术运算符 | |||
+ 加操作 | - 减操作 | * 乘操作 | / 除操作 |
~/取整操作 | %取余操作 | ++ 自增 | -- 自减 |
关系运算符 | |||
== 等于 | != 不等于 | > 大于 | < 小于 |
>= 大于等于 | <= 小于等于 | ||
逻辑运算符 | |||
!取反 | && 并且 | || 或者 | |
赋值运算符 | |||
+= | -= | *= | /= |
~/= | %= | = 赋值 | ??= 空赋值(非空不赋值) |
条件运算符 | |||
if | if else | switch | switch case |
? : 三目运算 | ?. 成员访问,与.相同,左边可以为空(空指针安全) |
比较有意思的赋值操作符示例:
a ?? "123" ///表示如果 a 为空,返回123
a ??= "123" ///表示如果 a 为空,给 a 设置成 123
a ~/123 ///a 对于 123 整除
箭头函数,话不多说,直接上代码:
//使用=>遍历list
var list = ['aa','bb','cc','dd'];
//forEach 遍历
list.forEach((value){
print(value)
});
//使用=>函数遍历 箭头函数后面只能根一行代码
list.forEach((value) => print(value));
一个类中默认构造函数只能写一个,哪怕入参不一样也不行。这一点和java不一样
class Abc{
String a;
String b;
//简写的构造函数 下边语句可以直接给属性赋值
Abc(this.a,this.b);
//命名构造 可以有多个
Abc.info(){}
}
有人称之为 计算属性
get关键字 定义get方法,使用时如访问属性一样:class.info;
get info{
return '你好!!';
}
set关键字 定义set方法,使用时如访问属性一样:class.pName= '里斯';
set pName(String v)(
this.name = v;
)
Dart中 冒号是 初始化列表
calss Abc{
String a;
String b;
//构造函数运行前 初始化变量
Abc():a = '你',b = '好'{ ... }
}
当库中方法冲突时:
import 'lib/abc1.dart';
//在开发过程中,难免会有不同库中出现同一命名方法,这时我们就可以使用 as 重命名。
import 'lib/abc2.dart' as a;
//使用
Abc a1 = new Abc();
a.Abc a2 = new a.Abc();
部分导入/隐藏
// 使用 show 进行部分导入,此时只能访问xxx1方法
import 'lib/abc1.dart' show xxx1;
// 使用 hide 进行部分隐藏,此时不能访问xxx2方法
import 'lib/abc1.dart' hide xxx2;