Dart个人学习笔记(上)

Dart教程

一、Dart简介

入口方法介绍

//这是一个简单的main方法
main(){
	
}

//表示main方法没有返回值
void main(){

}

注释方法

//ss

/*
ss
*/

///ss

变量

  • dart是一个强大的脚本类型语言,可以不预先定义变量类型,自动会类型推导

  • 可以通过var关键字声明变量

  • 也可以用类型关键词声明,如:

    var str = 'this is a var';
    Srting str2 = 'this is a var';
    int num3 = 123;
    

常量

constfinal关键字声明

  • const值不变,一开始就得赋值
  • final可以开始不赋值,只能赋一次
  • 两者区别:final比const更强大,final不仅有const编译时常量的特性,更重要的是它是运行时常量,并且final是惰性初始化,即在运行时第一次使用前才初始化。
  • 常量在定义后不可以改变值
const num1 = 1234;
final num2 = 2345;

//另外final可以这样用,const不可以
final a = new DateTime.now();
print(a);
//结果:2021-05-13 10:15:17.378402

//final可以开始不赋值
final a;
a = new DateTime.now();
print(a);

命名规则

  • 变量名称必须由数字、字母、下划线和美元符($)组成;
  • 注意:变量名称开头不能是数字
  • 标识符不能是保留字或关键字
  • 变量名称区分大小写

二、数据类型

Dart中支持以下数据类型:

  • 常用数据类型:

    • Numbers(数值):int,double
    • Strings(字符串):String
    • Booleans(布尔):bool
    • List(数组):在Dart中,数组是列表对象,所以大多数人只是称他们为列表
    • Maps(字典):Map是一个键值对相关的对象,
  • 项目中用不到的数据类型:

    • Rune:UTF-32编码的字符串,可以通过文字转换成符号表情或者代表特定的文字
    • Symbol:表示在程序中声明的运算符或标识符

1. 字符串类型

字符串的定义
//单、双引号命名
String str1 = 'this is str1';
String str2 = "this is str2";

//三个引号(单/双都可以)命名,其中可以放多行字符串
String str3 = '''this is str1
this is str2
this is str3
''';
字符串拼接
String str1 = 'hello';
String str2 = 'Dart';

//print("$str1 $str2");
  
//print(str1 + str2);

2. 数值类型

  • int是整型,double可以加整型,也可以加浮点型
  • 运算符:加减乘除

3. 布尔类型

只有true、false两个值

bool flag = true;
print(flag);
条件判断语句
bool flag = true;
  if (flag) {
    print('真');
  } else {
    print('假');
  }

4. List(数组/集合)类型

List初始化
  • 直接创建

    var l1 = [123, 'two', true];
    
    print(l1);
    print(l1.length);
    print(l1[1]);
    
  • 指定类型:在List前加一个尖括号里加上字符类型,元素就只能是这种类型

    var l1 = <String>['123', 'two', 'true'];
    
  • 固定长度:length参数是长度,fill参数是填充内容

    //利用List.filled方法
    var l6 = List.filled(length,fill);
    
    //示例
    var testList = List.filled(2, 'test');
    print(testList);
    
    //修改数据内容
    testList[1] = '1234';
    
    //固定长度的List没法修改长度
    testList.length = 0;//会报错
    
    //固定长度的指定类型
    var testList = List<String>.filled(2,"")
    
  • 注意:在新版本中,这种定义List的方法被废弃,但是在flutter2.x可以使用

    var l6 = new List();//会报错
    
增加数据
var l2 = [];

print(l2);
print(l2.length);//此时是空集合,所以length理所应当也是0
l2.add('张三');
l2.add('李四');

print(l2);//数据添加到末尾,所以内容为[张三,李四]

//同样非空集合也可以增加数据
var l5 = [20, true, 262];
l5.add("value");
print(l5);
修改长度
//对于没有固定长度的List,可以通过这种方式修改长度
var testList = [123, 456];

testList.length = 0;

print(testList);//[]
print(testList.length);//0
常用属性及方法
/*
常用属性:
length 长度
reversed 翻转
isEmpty 是否为空
isNotEmpty 是否不为空

常用方法:
add 增加(增加一个数据)
addAll 拼接数组(增加多个数据)
indexOf 查找 传入具体值(查找不到返回-1,查到到返回索引值)
remove 删除 传入具体值(直接指定某个数据)
removeAt 删除 传入索引值(指定数据在List里的位置)
fillRange 修改
insert(index,value) 指定位置插入(插入单个数据)
insertAll(index,list) 指定位置插入List(插入多个数据)
toList 其他类型转换成List
join List转换成字符串
split 字符串转换成List
*/

//length属性---------------------- 
List myList = [1, 2, 3];
  print(myList.length);//3

//indexOf方法---------------------- 
List myList = [1, 2, 3];
print(myList.indexOf(4));//-1
print(myList.indexOf(3));//2

//remove方法---------------------- 
List myList = [1, 2, 3];
myList.remove(2);
print(myList);//[1,3]

//removeAt方法----------------------
List myList = [1, 2, 3];
myList.removeAt(2);
print(myList);//[1,2]

//fillRange方法---------------------- 
List myList = [1, 2, 3];
myList.fillRange(1, 2, 'aaa');//在1,2位置之间替换成'aaa'
print(myList);//[1, aaa, 3]

//join方法---------------------- 
List myList = [1, 2, 3];
var str = myList.join('-');//转换成字符串,并用-连接
print(str);//1-2-3
print(str is String);//ture 判断结果是字符串

5.Map类型

  • 有点类似JavaScript中的Json对象

  • 这里的key值必须加引号

  • 定义Map的方法

    //定义方法1
    var person = {"name": "John Wick", "age": 18};
    
    //定义方法2
    var person = new Map();
    
    person["name"] = "John Wick";
    person["age"] = "40";
    person["work"] = ["assassin", "killer"];
    
  • 访问Map中的值

//访问Map中的值
print(person["name"]);

//dart中不能用person.name这种形式访问
Map的常用属性及方法
/*
常用属性
keys 获取所有的key值
values 获取所有的value值
isEmpty 是否为空
isNotEmpty 是否不为空

常用方法
remove(key) 删除指定key的数据
addAll({...}) 合并映射 给映射内添加属性
containsValue 查看是否有这个value值 返回true/false
*/

//---------------------- 
Map person = {'name': 'johnwick', 'age': 50, 'job': 'killer'};
print(person.keys); //(name, age, job)
print(person.values.last); //killer,也可以在后面加属性使用

//containsValue---------------------- 
Map person = {'name': 'johnwick', 'age': 50, 'job': 'killer'};
print(person.containsValue('killer')); //true
几种通用类型的方法
forEach  map  where  any  every

遍历内容–forEach

//方法1
List l1 = [1, 2, 3];
for (var i = 0; i < l1.length; i++) {
    print(l1[i]);
}

//方法2
for (var item in l1) {
    print(item);
}

//---------------------- 
//forEach
//在List中使用,参数只能写value一个内容
List l1 = [1, 2, 3];

l1.forEach((value) {
    print("$value");
});/*
1
2
3
*/

//在Map中使用,参数需要写(key,value)
Map m1 = {'name': 'john', 'age': '50', 'work': 'worker'};

m1.forEach((key, value) {
    print(('$key:$value'));
});/*
name:john
age:50
work:worker
*/

遍历并修改内容–map(将数字加倍)

//一般方法
List l1 = [1, 2, 3];
List l2 = [];
for (int i = 0; i < l1.length; i++) {
    l2.add(l1[i] * 2);
}
print(l2);//[2, 4, 6]

//---------------------- 
List l1 = [1, 2, 3];
var newList = l1.map((value) {
    return value * 2;
});
print(newList);//(2, 4, 6)

满足条件的返回新的集合

List l1 = [1, 2, 3, 5, 7, 8, 9, 11];
var l2 = l1.where((value) {
    return value >= 5;
});
print(l2);//(5, 7, 8, 9, 11)

是否有满足条件的内容

//any 只要有一个满足就true
List l1 = [1, 2, 3, 5, 7, 8, 9, 11];
  var f = l1.any((element) {
    return element >= 5;
  });
  print(f);//true

//----------
List l1 = ['name', 'age', 'work'];
var f = l1.any((element) {
	return element == 'age';
	});
print(f);//true

//---------------------- 
//every 每一个都满足才是true
List l1 = ['name', 'age', 'work'];
var f = l1.every((element) {
    return element is String;
});
print(f);//true

6. Set类型

  • 最主要的功能是去除数组重复内容
  • 没有顺序且不能重复的集合,所以不能通过索引获取
  • 且它的类型是Set,而不是List或Map

新建一个Set

var s = new Set();
s.add('a');
s.add('b');
s.add('c');
s.add('a');
print(s);//{a,b,c},即重复的数据没有被添加进去
print(s is List);//false
print(s is Map);//false
print(s is Set);//true

Set的去重

//将一个List通过变为Set类型的方式去重
List l1 = [1, 2, 3, 4, 2, 1];
var s1 = l1.toSet();
print(s1);//{1, 2, 3, 4}
print(s1 is Set);//true

7. 类型判断

is关键字来判断类型

var str = true;
if (str is String) {
    print('this is a string');
    } else {
        print('this is other type');
    }

8.运算符

算术运算符
+ - * / //加减乘除
% //其余
~/ //取整
    
//----------------------    
print(10 % 3); // 1
print(20 ~/ 3);// 6
关系运算符

主要用在条件判断里

> < //大于,小于
>= <= //大于等于,小于等于
== != //相等,不等   

//---------------------- 
print(3 == 5); //false
print(4 == 4); //true

//---------------------- 
int a = 3;
int b = 5;
if (a > b) {
    print('a大于b');
} else if (a == b) {
    print('a等于b');
} else {
    print('a小于b');	//a小于b
逻辑运算符
! //取反
&& //且:全为true,结果为true,其他为false
|| //或:全为false,结果为false,其他为true
    
//---------------------- 
bool str1 = true;
bool str2 = false;

print(!str1); //false
print(str1 && str2); //false
print(str1 || str2); //true
赋值运算符
= ??=//基础赋值运算符
// ??=的意思是如果这个变量没有值的话,则赋值给他

int a = 10; //a=10
int b = 

+= -= *= /= %= ~/= //复合赋值运算符
条件表达式

if…else…

switch…case…

if...else 
switch...case...(default...)
    
//------if...else--------    
bool flag = true;
if (flag) {
  print('is true');
} else {
  print('is false');
} //true

//-----switch...case------ 
var sex = '男';

switch (sex) {
	case '男':
        print('男生');
        break;
    case '女':
        print('女生');
        break;
    default:
        print('输入错误');
        break;//男生

//---------------------- 

三目运算符(又称条件运算符)

可以简化只有两种选择的运算,结果是正确的,就会选择

/*语句结构:
(条件) ? (判断正确的结果) : (判断错误的结果);
*/
//----以下两种表达式等效----- 
var x = 10;
  if (x > 0) {
    x = 20;
  } else {
    x = -20;
  }

//----------
var x = 10;
  (x > 0) ? (x = 20) : (x = -20);
  print(x);
var x = 34;
  (x > 0) ? (print('x是大于0的')) : (print('x是小于0的'));
//x是大于0的

??运算符

也是判断一个变量是否为空

 var a;
  var b = a ?? 10;//判断a是否为null,是则赋值10,否则不赋值。
  print(b); //10
  print(a); //null

9.类型转换

Number与String之间转换
  • Number→String: toString()
  • String→Number: parse()
//----------String→Number------------ 
String str = '123';
var myNum = int.parse(str);
print(myNum);//123

String str = '123.23';
var myNum = double.parse(str);
print(myNum);//123.23
//---------------------- 
//如果遇到数据可能为空的情况下,可以用try...catch
try {
    String str = ' ';
    var myNum = double.parse(str);
    print(myNum);
  } catch (error) {
    var myNum = 0;
    print(myNum);
  }
//----------Number→String------------ 
int num1 = 123;
var str = num1.toString();
print(str is String);//true
其他类型和boolean类型的转换
  • isEmpty&isNotEmpty:判断字符串是否为空
var str = '';
  if (str.isEmpty) {
    print('str is empty');
  } else {
    print('str is not empty'); //str is empty
//数字可以用==null来代替
var myNum;
  if (myNum == null) {
    print('myNum is null');
  } else {
    print('myNum is not null');
  } //myNum is null
//----------------------
//其他的判断语句起到的也是同样的作用,主要是用 is、==、?=等判断

三、循环语句

首先先复习一下自增/自减运算符

  • ++ –
  • 在赋值运算中,运算符放在前面后面有区别
    • 运算符在后面表示先运算,后赋值
    • 运算符在前面表示先赋值,后运算
  • 但是在其他地方,就没有区别

var a = 10;
var b = a++;
print('$a $b'); //11 10
//---------------------- 
var a = 10;
var b = ++a;
print('$a $b'); //11 11
//---------------------- 
var a = 10;
++a; //11

for循环

//输出1-10的数字
for (int i = 1; i <= 10; i++) {
    print(i);
  }

//---------------------- 
//输出1-20的偶数
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
      print(i);
    }
  }

//---------------------- 
//输出1到100的和
var sum = 0;
  for (int i = 1; i <= 100; i++) {
    sum += i;
  }
print(sum);//5050

//---------------------- 
//遍历一个List
Li//----------------------  0; i < l1.length; i++) {
    print(l1[i]);
  } 

//---------------------- 
//访问List中,Map中的元素
List l1 = [
    {'name': 'a', 'age': 18},
    {'name': 'bb', 'age': 14},
    {'name': 'ccc', 'age': 12}
  ];
  for (int i = 0; i < l1.length; i++) {
    print(l1[i]['name']);
  }


//---------------------- 
//访问一个二维数组里的内容
/*
需要打印出的内容:
国内
	国内新闻1
	国内新闻2
	国内新闻3
国际
	国际新闻1
	国际新闻2
	国际新闻3
*/
//思路:需要循环体嵌套,首先是“国内”和“国外”,需要用循环体打印出来。然后在每个循环下面,分别打印出来新闻1,2,3。
List l1 = [
  {
    'cate': '国内',
    'news': [
      {'title': 'news1'},
      {'title': 'news2'},
      {'title': 'news3'}
    ]
  },
  {
    'cate': '国外',
    'news': [
      {'title': 'internews1'},
      {'title': 'internews2'},
      {'title': 'internews3'}
    ]
  }
];

for (int i = 0; i < l1.length; i++) {
  print(l1[i]['cate']);

  for (int j = 0; j < l1[i]['news'].length; j++) {
    print(l1[i]['news'][j]['title']);
  }
}

while,do…while循环

语法格式如下:

while(表达式/循环条件){
	语句/循环体
}

do{
	语句/循环体
}while(表达式/循环体);
//显而易见,while是先通过条件,再循环;do...while是先进行循环体,在条件判断

注意:

  • 最后的分号不要忘记
  • 循环条件中使用的变量需要初始化
  • 循环体汇总,应有结束循环的条件,否则会造成死循环。
  • 区别:
    • while是先进行一次判断,满足条件进行循环;
    • do…while是先进行一次循环体,再判断,如果不满足,停止循环。
//打印1-10
int i = 1;
while (i <= 10) {
  print(i);
  i++;
}

//---------------------- 
//打印1-100的和
int i = 1;
int sum = 0;
while (i <= 100) {
  sum += i;
  i++;
}
print(sum);
//---------------------- 

swicth…case

  • case表达式是必须的
  • case语句只能包含常量,不能是变量或表达式
  • default 是可选的
var grade = 'C';
  switch (grade) {
    case 'A':
      {
        print('A级');
      }
      break;

    case 'B':
      {
        print('B级');
      }
      break;

    default:
      {
        print('没有结果');
      }
  }

break、continue

  • break语句的作用
    • 在switch语句中使流程跳出switch结构
    • 在循环语句中使流程跳出当前循环,遇到break循环终止,后面代码也不会执行。
    • 如果在循环中已经执行了break语句,那就不会执行循环体中的位于break后的语句
    • 在多层循环中,一个break语句只能向外跳出一层
    • break可以用在switch…case中,也可以用在for循环和while循环中
  • continue语句的功能
    • 跳过本次循环
    • 【注】:只能在循环语句中使用,使本次循环结束,即跳过循环体从下面尚未执行的语句,接着进行
//打印1-10的值,如果i=4就跳过
for (int i = 1; i <= 10; i++) {
    if (i == 4) {
      continue; //跳过本次循环
    }
    print(i);
  }


//---------------------- 
//打印1-10的值,遇到4就停止打印
for (int i = 1; i <= 10; i++) {
    if (i == 4) {
      break;
    }
    print(i);
  }


//---------------------- 
//演示break只能跳出一层
for (int i = 1; i <= 5; i++) {
    print('外层---$i');

    for (int j = 1; j <= 3; j++) {
      if (j == 2) {
        break;
      }
      print('里层$j');
    }
  }
/*
外层---1
里层1
外层---2
里层1
外层---3
里层1
外层---4
里层1
外层---5
里层1
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值