应用场景:
- 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++);
};
}