应用场景:
* Web开发
* 跨平台移动应用开发(flutter)
* 脚本或服务端开发
开发环境搭建:
SDK安装:
Window平台: choco install dart-sdk
Linux平台: sudo apt-get install dart
Mac平台: brew tap dart-lang/dart 然后 brew install dart --devel
node: 在mac上我进行手动安装的
IDE安装:
node: 我用的vscode,安装拓展Dart2.22.3和Code Runner
Dart语言入门
dart一切都是对象
Hello World
* main方法是固定写法,它是程序入口
* print方法可以在控制台输出内容
* 通过文件选择run,可以运行文件中的main方法 //Main 程序入口 void main(){ //控制台打印 print("Hello
World!"); }
变量
*
使用var声明变量,可复制不同类型的值
*
未初始化时,默认为null
*
使用final声明一个只能赋值一次的变量
var a; print(a); a = 10; print(a); a = 'Hello Dart'; print(a); var b = 20;
print(b); final c = 30; //c = "Dart";//给c赋值打印会报错
常量
*
使用const声明常量
const d = 20; // d = 50;//给d赋值打印会报错
数据类型
内置类型:
*
数值型-Number
整形-Int
浮点型-double
*
字符串-String
*
布尔型-Boolean
*
列表-List
*
键值对-Map
*
Runes、Symbols(不常用)
数值型操作:
*
运算符: +、-、*、/、~/取整、%取余
*
常用属性: isNaN是否是非数字、isEven、isOdd等
*
常用方法: abs()、round()、floor()、ceil()、toInt()、toDouble()
num aa = 10; aa = 12.5; int bb = 20; // bb = 20.5; double cc = 10.5; cc = 30;
print(bb + cc); print(bb - cc); print(bb * cc); print(bb / cc); print(bb ~/
cc);//取整 print(bb % cc);// 取余 print(bb.isEven);//是否是偶数 print(bb.isOdd);//是否是奇数
int dd = -100; print(dd.abs());//取绝对值 double ee = 10.5;
print(ee.round());//四舍五入 print(ee.floor());//不大于ee的最接近ee的整数
print(ee.ceil());//不小于ee的最接近ee的整数 print(bb.toDouble());//整形转浮点型
print(ee.toInt());//浮点型转整形
字符串-String
* 使用单引号,双引号创建字符串
* 使用三个引号或双引号创建多行字符串
* 使用r创建原始raw字符串 String str1 = 'hello';// "" String str2 = ''' hello
Dart''';//''' print(str2); String str3 = 'hello \n Dart'; print(str3); String
str4 = r'hello \n Dart';//打印原始内容,不转意 print(str4);
字符串操作:
* 运算符:+、*、==、[]
* 插值表达式: ${expression}
* 常用属性: length、isEmpty、isNotEmpty String str5 = "This is my favorite
language"; print(str5 + "New");//加 print(str5 * 5);//乘 print(str4 ==
str5);//判断两个str3和str4是否相等 print(str5[0]);//输出:0 int aaa = 1; int bbb = 2;
print("aaa + bbb = ${aaa + bbb}");//(插值表达式)输出:aaa + bbb = 3
print(str5.length);//str5的长度 print(str5.isEmpty);//判断str5是否为空
print(str5.isNotEmpty);//判断是否不为空
字符串常用方法:
* contains(),subString()
* startsWith(),endsWith()
* indexOf(),lastIndexOf() //取字符串下表
* toLowerCase(),toUpperCase() //大小写转换
* trim(),trimLeft(),trimRight() //截取前后的空格
* split(),replaceXXX() //分割字符串 + 替换
print(str5.contains("Tiis"));//str5是否包含"This"字符
print(str5.substring(0,3));//截取str5第0个字符到第3个字符
print(str5.startsWith("a"));//str5是否以字母a开头
print(str5.endsWith("e"));//str5是否以字母e结尾 var list = str5.split("
");//str5以字符空格分割成数组 print(list);//输出: [This, is, my, favorite, language]
print(str5.replaceAll("This","That"));//将str5中的This字符替换为That
布尔型-bool
* 使用bool表示布尔类型
* 布尔值只有true和false bool isTrue = true; bool isFalse = false;
print("Hello".isEmpty);
List( 数组)创建
* 创建List: var list = [1,2,3];
* 创建不可变的List: var list = const[1,2,3];
* 构造创建:var list = new List(); ///List数组 var list1 = [1,"Dart",true];
print(list1); print(list1[1]); list[1] = "Hello"; print(list1); var list2 =
const [1,2,3]; // list2[0] = 5; var list3 = new List();//list的创建
List-常用操作
* [],length
* add(),insert()
* remove(),clear()
* indexOf(),lastIndexOf()
* sort(),sublist()
* shuffle()数组打乱顺序,asMap(),forEach() var list4 = ["hello","dart"];
print(list4.length);//数组元素个数 list4.add("new");//数组添加元素 print(list4);
list4.insert(1,"java");//插入java字符到数组1位置 print(list4);
list4.remove("java");//数组移除java字符 print(list4); // list4.clear();//数组清空元素 //
print(list4); print(list4.indexOf("dart"));//如果找到的话,返回元素所在的位置;找不到的话,会返回-1
list4.sort();//排序 print(list4); print(list4.sublist(1));//截取从第二个元素开始
list4.forEach(print);//对数组的每个元素执行一次提供的函数(传入函数作为参数)
Map-创建
*
创建Map:var language = {'first':'Dart','second':'Java'};
*
创建不可变Map:var language = const{'first':'Dart','second':'Java'};
*
构造创建: var language = new Map();
* var map1 = {"first":"dart",1:true}; print(map1); print(map1["first"]);
print(map1[1]); map1[1] =false; print(map1); var map2
=const{1:"Dart",2:"java"}; // map2[1] = "python";//不能给不可变Map赋值 var map3 = new
Map()
Map-常用操作
* [],length
* isEmpty(),isNotEmpty()
* Keys,values
* containsKey(),containsValue()
* remove()
* forEach() void main() { var map =
{"first":"dart","second":"java","third":"python"}; print(map.length); //
map.isEmpty; print(map.keys);//打印所有map的key print(map.values);//打印所有map的值
print(map.containsKey("first"));//map是否包含某个key
print(map.containsValue("C"));//map是否包含某个值 map.remove("third");//移除third对应的值
print(map); map.forEach(f);//给每个值增加f方法 var listMap = ["1","2","3"];//list转Map
print(listMap.asMap()); } void f(key,value){ print("key=$key,value=$value"); }
dynamic
/// dynamic 指任意类型 dynamic bcde = 20; bcde = "JavaScript"; var listW =new
List<dynamic>();//泛型 listW.add(1); listW.add("hello"); listW.add(true);
print(listW);
运算符
算术运算符
* 加减乘除: +,-,*,/,~/,%
* 递增递减: ++var,var++,--var,var--
关系运算符
* 运算符: ==,!=,>,<,>=,<=
* 判断内容是否相同使用==
逻辑运算符
* 运算符: !,&&,||
* 针对布尔类型运算 /// 逻辑运算符 bool isTrue = true; print(!isTrue); bool isFalse =false;
print(isTrue && isFalse); print(isTrue || isFalse); String str = "";
print(!str.isEmpty);
赋值运算符
* 基础运算符: =,??=
* 复合运算符: +=,-=,*=,/=,%=,~/= /// 赋值运算符 double acc = 10; int bcc; bcc ??=
10;//如果bcc值为空,则bcc=10 print(bcc); acc /= 2;//复合运算的一个例子 print(acc);
条件表达式
* 三目运算符: condition ? expr1 : expr2
* ??运算符: expr1 ?? expr2 int gender = 0; String strcc = gender == 0 ?
"Male=$gender" : "Female=$gender";//三目运算符 print(strcc); String aee ; String bee
= "Java"; String cee = aee ?? bee;//如果aee为空就等于bee print(cee);
控制流语句
条件语句
* if语句
* if...else if语句
* if...else if…else语句 int score = 90; if (score >= 90) { print("优秀"); }else
if (score > 60) { print("良好"); }else if (score == 60) { print("及格"); }else {
print("不及格"); }
循环语句
* for循环
* for...in循环 var listff = [1,2,3,4,5]; for (var i = 0; i < listff.length;
i++) { print(listff[i]); } for (var item in listff) { print(item); }
while语句
* while循环
* do...while循环 /// while语句 int countff = 0; while (countff<5) { print(countff
++); } print("--$countff----"); do {//先执行do语句再执行while里面的判断 print(countff--); }
while (countff > 0 && countff<5);
break和continue
* 终止循环: break
* 跳出当前循环: continue var listgg = [1,2,3]; for (var item in listgg) { if (item
== 2) { //break; continue;//跳出当前循环,继续执行下个循环 } print(item); }
print("-------------"); for (var item1 in listgg) { for (var item2 in listgg) {
if (item2==5) { break;//break是终止它所在的for循环(离它最近的for循环) } print(item2); } }
switch…case语句
* 比较类型: num,String,编译期常量,对象,枚举
* 非空case必须有一个break
* default处理默认情况
* continue跳转标签 /// switch...case语句 String languagegg = "Dart"; switch
(languagegg) { case "Dart": print("Dart is my favorite"); break; case "Java":
print("Java is my favorite"); break; case "Python": print("Python is my
favorite"); break; default: print("None"); } switch (languagegg) { case "Dart":
print("Dart is my favorite"); continue Testgg;//跳转到Testgg标签去执行操作 // break; case
"Java": print("Java is my favorite"); break; Testgg: case "Python":
print("Python is my favorite"); break; default: print("None"); }
方法
方法定义
返回类型 方法名 (参数1, 参数2,....) {
方法体...
return 返回值
}
void main() { /// 方法 print(getPerson("张三", 18)); } void f(key,value){
print("key=$key,value=$value"); }
方法特性
* 方法也是对象,并且有具体类型Function
* 返回值类型、参数类型都可以省略
* 箭头语法: =>expr 是{return expr;}缩写.只适用于一个表达式
* 方法都有返回值.如果没有指定,默认return null最后一句执行 String getPerson(String name,int age){
return "name = $name,age=$age"; } getPersonJX(name,age) =>
"name=$name,age=$age";//箭头函数简写上面函数 int gender = 1; getPrentJX2(name,age) =>
gender == 1 ? "name=$name,age=$age" : "test";//箭头函数加表达式 void
canNotGetPerson(String name,int age){//无返回值类型 print("name=$name,age=$age"); }
printPerson(name,age){//方法简写 print("name=$name,age=$age"); }
可选参数
* 可选命名参数:{param1,param2,...}
* 可选位置参数:[param1,param2,...]
* 如果存在具体参数,可选参数声明,必须在参数后面 void main() { //可选命名参数 newPerson("小强");
newPerson("小红",age:20); newPerson("小红",age:20,gender: "Male"); //可选位置参数
newPerson2("小绿",18,"Male"); } newPerson(String name,{int age,String
gender}){//基于命名可选参数(多用) print("name=$name,age=$age,gender=$gender"); }
newPerson2(String name,[int age,String gender]){//基于位置可选参数
print("name=$name,age=$age,gender=$gender"); }
默认参数值
* 使用 = 在可选参数指定默认值
* 默认值只能是编译时常量 newDefault(String name,{int age,String gender =
"Female"}){//默认参数值 print("name=$name,age=$age,gender=$gender"); }
方法对象
* 方法可以作为对象赋值给其他变量
* 方法可作为参数传递给其它方法 void main() { //方法作为对象 var func = printHello; func();
Function func2 = printHello; func2(); //方法作为函数参数使用 var listhh = [1,2,3,4];
listhh.forEach(print); var listii = ["h","e","l","l","0"];
print(listTimes(listii,times)); } void printHello() { print("hello"); } List
listTimes(List list,String t(str)){ for (var i = 0; i < list.length; i++) {
list[i] =t(list[i]); } return list; } String times(str){ return str*3; }
匿名方法
(参数1,参数2,...) {
方法体...
return 返回值
}
匿名方法特性
* 可赋值给变量,通过变量进行调用
* 可在其它方法中直接调用或传递给其它方法 void main() { //匿名函数 var funcii = (str){
print("hello---$str"); }; funcii(30); // ((){ // print("Test"); // })(); var
listll = ["h","e","l","l","o"]; var result = listTimes(listll, (str){return str
* 3;}); print(result); } List listTimes(List list,String t(str)){ for (var i =
0; i < list.length; i++) { list[i] =t(list[i]); } return list; }
闭包
* 闭包是一个方法(对象)
* 闭包定义在其它方法内部
* 闭包能够访问外部方法内的局部变量,并持有其状态 void main() { ///闭包 var funcmm =ann(); funcmm();
funcmm(); funcmm(); funcmm(); } amm(){ int count = 0; printCount(){
print(count++); } return printCount; } ann(){ int count = 0; // printCount(){
// print(count++); // } return (){ print(count++); }; }
热门工具 换一换