Dart认识

夏侯涵映
2023-12-01

Dart

Dart SDK安装

Dart for Windows 下载安装包

vscode编辑器安装dart 和code runner插件

1.dart 的基本语句

1.入口:

 main(){
     print('hello dart')
 }
 ​
 //表示main方法没有返回值
 void main(){
      print('hello dart')
 }

2.dart 变量

1.定义变量

可以使用var关键字也可以通过类型声明变量

 var str ="this is var";
 String str = "this is String";
 int str =123;
 ​
 ​
 void main() {
 var str = "你好 dart";
 print(str);//打印
 }

数字类型:int

字符串类型:String

2.dart的命名规则

  1. 变量名称必须是数字、字母、下划线和美元符号($)组成

  2. 注意:标识符开头不能是数字

  3. 标识符不能是保留字和关键字

  4. 变量的名字是区分大小的:age和Age是不同的变量。(建议不这样用)

  5. 建议变量名使用名词,方法名使用动词

3.dart 常量

final 和 const 修饰符

  1. const 值不变一开始就需要赋值

  2. final开始可以不复制,只能赋值一次;而final不仅有const 的编译时常量的特性,最重要的是他运行时常量,并且final是惰性初始化,及运行时第一次使用前才被调用

  3. 永远不改变的量,使用final和const修饰他,而不是var或者其他变量类型。

 void main() {
   final date = new DateTime.now();
   print(date);
 }
 //此时const会报错,调用方法赋值给一个常量时,使用final。

###

4.dart中支持的数据类型

1.常用数据类型

Numbers(数值):int (整型) double(浮点型)

Strings(字符串):String

Booleans(布尔):bool

List(数组):在Dart中,数组是列表对象,也可以称为列表

Maps(字典):Map是一个键值对相关的对象。键和值可以是任何类型的对象。每个键

注意:不会进行类型转换

 ​
 // 单引号或者双引号可以多行
 String str = """ this is dart
                 this id dart """
 ​
 ​
 /*
 字符串拼接
 */
  var str = "hello ";
     var str1 = "dart";
     // print ("$str $str1");
     print (str+str1);
 ​
 /*
     数值类型
 */
     int a = 123;
     double b = 23.45;
     double c =24;
     console.log(c);//24.0
 /*
     Booleans(只有两个值,true和false)
 */
  bool flag1 = true;
  bool flag2 = flase;
 ​
 /*
     条件判断语句
 */
      bool flag = true;
     if(flag){
      print('真的');
  }else{
      print('假的');
  }
 //==============----------------------
  void main() {
    var a = 123;
    var b = "123";
    if (a == b) {
      print('a和b相等');
    } else {
      print('a和b不相等');
    }
  }
    // a和b不相等
 ​
 /*
     1.第一种定义List的方法
 */
  void main() {
    var list = ['张三', '李四', '王五'];
    print(list.length);//3
    print(list[1]);//李四
  }
 ​
 ​
 /*
     2.第二种定义List的方法
 */    
 var lo = new List();
 lo.add('张三');
 lo.add('李四');
 lo.add('王五');
 print(lo.length);
 print(lo[1]);
 ​
 /*
     1.第一种定义Maps的方式
 */
       var person = {
  "name": "张三",
  "gae": 28,
  "gender": "男",
  "job": ["程序员", "外卖员"],
 };
 print(person);
 print(person["age"]);
  print(person["name"]);
     print(person["gender"]);
  print(person["job"]);
 ​
 /*
 {name: 张三, gae: 28, gender: 男, job: [程序员, 外卖员]}
 null
 张三
 男
 [程序员, 外卖员]
 */
 ​
 /*
     2.第二种定义Maps的方式
 */    
 var p = new Map();
 p['name'] = '张三';
 p['gae'] = 24;
   p['gender'] = '男';
 p['job'] = ["程序员", "外卖员"];
   print(p);
 print(p["age"]);
  print(p["name"]);
     print(p["gender"]);
  print(p["job"]);

2.数据类型判断

is关键词判断

 var str = '1234';
 if (str is String) {
  print('对的');
 }
 //对的

5.dart 运算符

1.算数运算符

 int a =13;
 int b =5;
 ​
 print(a + b);
 print(a - b);
 print(a * b);
 print(a / b);
 print(a % b);//取余
 print(a ~/ b);//取整
 ​
 /*
 18
 8
 65
 2.6
 3
 2
 */

2.关系运算符

 int a =3;
 int b =5;
 ​
 print(a == b);
 print(a != b);
 print(a > b);
 print(a > b);
 print(a >= b);
 print(a <= b);
 ​
 /*
 false
 true
 false
 false
 false
 true
 */
 ​

3.逻辑运算符

 // ! 取反
 bool flag = true;
 print(!flag);
 ​
 /* &&并且  全为true才为true 否则false */
 bool a = true;
 bool b = false;
 ​
 print(a&&b);
 ​
 /* || 或者 全为false才为false 否则true */
 bool c = true;
 bool d = false;
 print(c||d);
 ​
 ​
 /*
 false
 true
 false
 false
 false
 true
 */

4.赋值运算符

1.基础赋值运算符

= ??==

 b??==23;
 //表示如果b的值为空的话把23赋值给b

2.复合赋值运算符

+= -= *= /= %= ~/=

 var a = 10;
 a += 10;//a=a+10;
 print(a); //20

3.条件表达式

 /*
 三目运算符
 */ 
 bool flag = true;
 String success = flag ? '成功' : '失败';
 print(success);//成功
 ​
 /*
 if else
 */ 
 var score = 80;
 if (score>90) {
 print('优秀');
 }else if(score>70){
  print('良好');//良好
 }else if(score>=60){
  print('及格');
 }else{
  print('不及格');
 }
 ​
 /*
 switch case
 */
 var sex = "男";
 switch (sex) {
  case "男":
    print('男');
    break;
  case "女":
    print('女');
    break;
  default:
    print('参数错误');
    break;
 }
 //男
 ​
 /*
 ??运算符
 */
 ​
 var a;
 var b = a ?? 10;
 print(b);//10
 ​
 ​
 var a=22;
 var b = a ?? 10;
 print(b);//22
 ​

4.类型转换

 //1.Number和String类型之间的转换
 ​
 /*
 String==>Number  parse()
 */
 String a = '10';
 var b = int.parse(a);
 print(b);//10
 ​
 ​
 String myNum = '12.32';
 var newNum = double.parse(num);
 print(newNum);//12.13
 ​
 //当出现代码出错时,可抛出另一种结果,且不会报错
  String price = '';
  try{
    var newPrice = double.parse(price);
     print(newPrice);
  }catch(err){
      print(0);//0
  }
 ​
 ​
 /*
 Number==>String  toString()
 */
 int a = 41;
 var str = a.toString();
 print(str is String);//true
 ​
 ​
 /*
 其他类型 ===》布尔类型  
 */
 ​
 //isEmpty可以判断字符串是否为空
 var str = '';
 print(str.isEmpty);//true
 ​
 //判断数字是否为空
 var myNum;
 if(myNum==null){
   print('为空');
 }else{
   print('不为空');
 }
 ​
 //NaN
     var num1 = 0/0;
     print(num1);//NaN
   if(num1.isNaN){
      print('num1是NaN');//num1是NaN
   }
 ​
 ​
 ​

5.自增和自减运算

 var a = 10;
 var b = a++; //先赋值后运算
 print(a);//11
 print(b);//10
 ​
 var a1 = 10;
 var b1 = ++a1; //先运算后赋值
 print(a1);//11
 print(b1);//11
 ​
 var c = 10;
 var d = c--; //先赋值后运算
 print(c);//9
 print(d);//10
 ​
 var c1 = 10;
 var d1 = --c1; //先运算后赋值
 print(c1);//9
 print(d1);//9

5.循环语句

1.for循环

 for (int i = 0; i < 10; i++) {
 print(i);
 }
 /*
 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
 */
 //==========================
 //1.打印0-50所有的偶数
 for (int i = 0; i <= 50; i++) {
 if (i % 2 == 0) {
  print(i);
 }
 }
 ​
 //2.求1+2+3+4+5+...+100的和
 var sum = 0;
 for (int i = 1; i <= 100; i++) {
 sum += i;
 }
 print(sum);//5050
 ​
 //3.计算5的阶乘(1*2*3*4*5)
 var result = 1;
 for (int i =1; i <= 5; i++) {
 result *=i;
 }
 print(result);//120
 ​
 //4.打印list里面['张三', '李四', '王五']的内容
 var list1 = ['张三', '李四', '王五'];
 for (int i = 0; i <list1.length; i++) {
 print(list1[i]); 
 }
 ​
 //5.打印list里面['张三', '李四', '王五']的内容
 var list1 = [
 {
 "name":'张三'
 },
 {
 "name":'李四'
 },
 {
 "name":'王五'
 }
 ];
 for (int i = 0; i <list1.length; i++) {
 print(list1[i]['name']); 
 }
 ​
 ​
 ​

2. while

 //1.求1+2+3+4+5+...+100的和
 ​
 //while
 var sum = 0;
 var i = 1;
 while (i <= 100) {
  sum += i;
  i++;
 }
 print(sum); //5050
 ​
 //do...while...
 var sum = 0;
 var i = 1;
 do{
  sum += i;
  i++;
 }while(i<=100);
 print(sum); //5050
 ​
 // 区别:循环条件不成立时,do...while...会执行一次while则不执行。

3.continue和break

 for (var i = 0; i < 10; i++) {
  if (i == 4) {
    continue;//跳出当次循环
  } else {
    print(i);
  }
 }
 /*
 0
 1
 2
 3
 5
 6
 7
 8
 9
 */
 ​
 ​
 for (var i = 0; i < 10; i++) {
  if (i == 4) {
    break;//终止循环
  } else {
    print(i);
  }
 }
 /*
 0
 1
 2
 3
 */
 ​
 //break和continue只会控制当层循环体
 for (var i = 1; i <6; i++) {
   print('外层循环---$i');
   for(var j = 1; j < 4;j++){
     if(j==3){
       break;
     }
      print('里层循环---$j');
   }
 }
 /*
 外层循环---1
 里层循环---1
 里层循环---2
 外层循环---2
 里层循环---1
 里层循环---2
 外层循环---3
 里层循环---1
 里层循环---2
 外层循环---4
 里层循环---1
 里层循环---2
 外层循环---5
 里层循环---1
 里层循环---2
 */

6.Dart的list

1.常用属性

length isEmpty isNotEmpty

reversed(列表倒序排序)

 List myList = ['香蕉', '苹果', '梨', '西瓜'];
 print(myList.reversed);
 var newList = myList.reversed.toList();
 print(newList);
 ​
     /*
         (西瓜, 梨, 苹果, 香蕉)
    [西瓜, 梨, 苹果, 香蕉]
     */

2.常用方法

add()

 List myList = ['香蕉', '苹果', '梨', '西瓜'];
 myList.add('桃子');
 print(myList);
 //[香蕉, 苹果, 梨, 西瓜, 桃子]

addAll() 拼接数组

 List myList = ['香蕉', '苹果', '梨', '西瓜'];
 myList.addAll(['桃子','柠檬','百香果']);
 print(myList);
 //[香蕉, 苹果, 梨, 西瓜, 桃子, 柠檬, 百香果]

indexOf() 查找

remove() 删除

removeAt 删除 传入索引值

fillRange(start,end,'数值') 修改

insert(index,value) 插入

insertAll(index,List) 插入

join() list转换成字符串

split ()字符串转换成list

toList() 其他类型转换成List

forEach()

map()

where()

any()

every()

3.set

set 是没有顺序且不能重复的集合,所以不能通过索引获取值

 var list = new Set();
 list.add('苹果');
 list.add('梨子');
 list.add('苹果');
 print(list);
 ​
 // {苹果, 梨子}

list去重

 List myList = ['香蕉', '西瓜', '梨', '西瓜'];
 var arr = new Set();
 arr.addAll(myList);
 print(arr.toList());

4.Maps

映射(Maps)是无序的键值对

  1. 常用属性

  • keys 获取所有的可以值

  • values 获取所有的value值

  • isEmpty 是否为空

  • isNotEmpty 是否不为空

  1. 常用方法

  • remove(key) 删除指定key 的数据

  • addAll({...}) 合并映射,给映射里面添加属性

  • containsValue 查看映射内的值 返回true/flase

  • forEach

  • map

  • where

  • any

  • every

 Map person = {
 "name": '张三',
 "age": 24,
 "gender": '男',
 };
 ​
 print(person.values);
 // (张三, 24, 男)
 ​
 //===========addAll==============
 person.addAll({
 'Work':['程序员','外卖员'], 
 'height':180
 });
 print(person);
 ​
 //{name: 张三, age: 24, gender: 男, Work: [程序员, 外卖员], height: 180}
 ​
 //===========remove==========
 person.remove('gender');
 print(person);
 //{name: 张三, age: 24, Work: [程序员, 外卖员], height: 180}
 ​
 //==============containsValue=================
 print(person.containsValue('张三'));
 //true

5.循环

for

 List myList = ['香蕉', '苹果', '梨', '西瓜'];
 for(var item in myList){
 print(item);
 }
 /*
 香蕉
 苹果
 梨
 西瓜
 */
 ​

forEach

 //===============循环List====================
 List myList = ['香蕉', '苹果', '梨', '西瓜'];
 ​
 myList.forEach((element) {  //注意list的这里只能传一个值
 print(element);
 });
 ​
 /*
 香蕉
 苹果
 梨
 西瓜
 */
 ​
 //==================循环Maps=========================
 ​
 Map person = {
 "name": '张三',
 "age": 24,
 "gender": '男',
 };
 ​
 person.forEach((key, value) { //遍历maps可以传两个参数
 print('$key---$value');
 });
 /*
 name---张三
 age---24
 gender---男
 */
 //============循环Set=========================
 ​
 var sets = new Set();
 sets.addAll(["11", "22", "33"]);
 sets.forEach((value) {
 print(value);
 });
 /*
 11
 22
 33
 */

map()

 var list = [1, 8, 9];
 var arr = list.map((value) {
 return value * 2;
 });
 var newList = arr.toList();
 print(newList);
 }
 //[2, 16, 18]

where

 var list = [1, 8, 9, 21, 28, 45, 85, 23];
 var newList = list.where((element){
 return element >= 12;
 });
 print(newList.toList());
 ​
 //[21, 28, 45, 85, 23]

any 只要集合里面有一个满足条件就返回true

 var list = [1, 8, 9, 21, 28, 45, 85, 23];
 var flag = list.any((value){
 return value >= 12;
 });
 print(flag);
 ​
 //true

every() 集合里面每一个都要满足条件才返回true

 var list = [1, 8, 9, 21, 28, 45, 85, 23];
 var flag = list.any((value){
 return value <100;
 });
 print(flag);
 //true

2.Dart方法

1.函数

1.自定义方法

基本格式:

返回类型 方法名称(参数1,参数2,....){

方法体

return 返回值;

}

注意:void (可写可不写),写了表示方法没有返回值

 //可以指定函数的返回类型
 void main() {
 var txt = getString();
 print(txt);
 }
 ​
 String getString() {
 var str = "this is String";
 return str;
 }
 ​

调用方法传参

 //1.求1到这个数的所有数之和
 void main() {
 var n = getSum(100);
 print(n);
 var n1 = getSum(10);
 print(n1);
 }
 ​
 int getSum(int num) {
 var sum = 0;
 for (var i = 1; i <= num; i++) {
 sum += i;
 }
 return sum;
 }
 ​
 ​
 //2.打印用户信息
 void main() {
 print(getUserInfo('张三',20));
 }
 ​
 String getUserInfo(String name, int age) {
 return "姓名----$name,年龄----$age";
 }
 ​
 //3.可选参数,参数可填可不填
 void main() {
 print(getUserInfo('张三'));
 }
 ​
 String getUserInfo(String name,[age]) {
 if(age!=null){
 return "姓名----$name,年龄----$age";
 }
 return "姓名----$name,年龄保密";
 }
 ​
 //4.默认参数赋值
 void main() {
 var p1 = getUserInfo('张三');
 print(p1);
 ​
 var p2 = getUserInfo('李四',20,'女');
 print(p2);
 ​
 var p3 = getUserInfo('王五',28,);
 print(p3);
 }
 ​
 String getUserInfo(String name, [age, gender = "男"]) {
 if (age != null) {
 return "姓名----$name,性别----$gender,年龄----$age";
 }
 return "姓名----$name,性别----$gender,年龄保密";
 }
 ​
 /*
 姓名----张三,性别----男,年龄保密
 姓名----李四,性别----女,年龄----20
 姓名----王五,性别----男,年龄----28
 */
 ​
 ​
 //5.命名参数
 void main() {
 var p1 = getUserInfo('张三');
 print(p1);
 ​
 var p2 = getUserInfo('李诗诗',age:20,gender:'女');
 print(p2);
 ​
 }
 ​
 String getUserInfo(String name, {age, gender = "男"}) {
 if (age != null) {
 return "姓名----$name,性别----$gender,年龄----$age";
 }
 return "姓名----$name,性别----$gender,年龄保密";
 }
 ​
 //6.实现把参数当做方法的方法
 void main() {
 fn() {
 print('object');
 }
 ​
 fn1(value) {
 value();
 }
 ​
 fn1(fn);
 }
 //object

2.箭头函数

 //箭头函数
 void main() {
 List myList = ['香蕉', '苹果', '梨', '西瓜'];
 myList.forEach((value) => print(value));
 }
 ​
 void main() {
 List myList = ['香蕉', '苹果', '梨', '西瓜'];
 myList.forEach((value) =>{
  print(value)
 });
 }
 ​
 /*
 香蕉
 苹果
 梨
 西瓜
 */
 ​

3.函数调用函数

 void main() {
 //定义一个方法是否为偶数
 bool isEvenNum(int n) {
 if (n % 2 == 0) {
  return true;
 }
 return false;
 }
 ​
 //获取1大100之前所有偶数
 getNum(int n) {
 for (var i = 1; i <= n; i++) {
  if (isEvenNum(i)) {
    print(i);
  }
 }
 }
 ​
 getNum(100);
 }
 ​

4.匿名方法

 var getNum = () {
  print('匿名方法');
 };
 getNum();

5.自执行函数

 void main() {
 (( int n) {
 print(n);
 print('我是自执行方法');
 })(20);
 }
 //20
 //我是自执行方法

6.方法的递归

自己调用自己

 //1.求1到n的乘积
 void main() {
 var num = 1;
 fn(int n) {
 num*=n;
 if (n == 1) {
  return;
 }
 fn(n-1);
 }
 fn(5);
 print(num);
 }
 //120
 //求1-100的和
 void main() {
 var num = 0;
 fn(int n) {
 num+=n;
 if (n == 1) {
  return;
 }
 fn(n-1);
 }
 fn(100);
 print(num);
 }
 //5050

6.闭包

 void main() {
 fn() {
 var a = 12;
 return () {
  a++;
  print(a);
 };
 }
 ​
 var b = fn();
 b();
 b();
 }
 ​
 //13
 //14

2.类

1.object

dart所有东西都是对象,所有的对象都继承Object类

 //自定义类
 void main() {
 var p = new Person();
 print(p.name);
 print(p.age);
 p.getName();
 }
 ​
 class Person {
 String name = "詹丹";
 int age = 24;
 void getName() {
 print("姓名:${this.name}-----年龄:${this.age}");
 }
 }
 /*
 詹丹
 24
 姓名:詹丹-----年龄:24
 */
 void main() {
 var p = new Person();
 print(p.name);
 p.getName();
 p.setInfo(20);
 print(p.age);
 p.getName();
 }

 void main() {
 Person p = new Person();
 print(p.name);
 p.getName();
 p.setInfo(20);
 print(p.age);
 p.getName();
 }

class Person { String name = "詹丹"; int age = 24; void getName() { print("姓名:${this.name}-----年龄:${this.age}"); }

void setInfo(int age) { this.age = age; } } /* 詹丹 姓名:詹丹-----年龄:24 20 姓名:詹丹-----年龄:20 */

2.构造函数

程序运行自动触发的方法

 void main() {
 Person p = new Person();
 }
 ​
 class Person {
 String name = "詹丹";
 int age = 24;
 void getName() {
 print("姓名:${this.name}-----年龄:${this.age}");
 }
 ​
 void setInfo(int age) {
 this.age = age;
 }
 ​
 //默认构造函数
 Person() {
 print('这是一个构造函数');
 }
 }
 //  Person p = new Person();实例化对象的时候触发。
 ​
 void main() {
 Person p = new Person('詹丹', 20);
 p.getName();
 ​
 Person p2 = new Person('李四', 28);
 p2.getName();
 }
 ​
 class Person {
 var name;
 var age;
 ​
 Person(String n, int a){
 this.name = n;
 this.age = a;
 }
 //简写  Person(this.name, this.age);
 ​
 void getName() {
 print("姓名:${this.name}-----年龄:${this.age}");
 }
 ​
 }
 /*
 姓名:詹丹-----年龄:20
 姓名:李四-----年龄:28
 */
 //命名构造函数
 void main() {
 Person p = new Person('詹丹', 20);
 p.getName();
 ​
 Person p2 = new Person('李四', 28);
 p2.getName();
 ​
 Person p3 = new Person.setInfo('李四', 32);
 p3.getName();
 }
 ​
 class Person {
 var name;
 var age;
 //简写
 Person(this.name, this.age);
 ​
 Person.now() {
 print('我是命名构造函数');
 }
 ​
 void getName() {
 print("姓名:${this.name}-----年龄:${this.age}");
 }
 ​
 Person.setInfo(String name, int age) {
 this.name = name;
 this.age = age;
 }
 }
 /*
 姓名:詹丹-----年龄:20
 姓名:李四-----年龄:28
 姓名:李四-----年龄:32
 */

3.私有属性和方法

在属性名和方法名前面加:_即可变成私有

 void _run() {
 print("这是一个私有方法");
 }

4.类中的getter和setter

调用get里面方法,直接调用属性的方式访问即可

 void main() {
 //获取面积
 var r = new Rect(10, 4);
 print("面积为:${r.area}");
 }
 ​
 class Rect {
 var width;
 var height;
 ​
 Rect(this.width, this.height);
 ​
 get area {
 return this.width * this.height;
 }
 }
 //面积为:40

setter

 ​
 void main() {
 //获取面积
 var r = new Rect(10, 4);
 print("面积为:${r.area}");
 ​
 r.aeraHeight = 6;
 print("面积为:${r.area}");
 }
 ​
 class Rect {
 var width;
 var height;
 ​
 Rect(this.width, this.height);
 ​
 get area {
 return this.width * this.height;
 }
 ​
 set aeraHeight(value) {
 this.height = value;
 }
 }
 ​

构造函数体运行之前初始化实例变量

 void main() {
 //获取面积
 var r = new Rect();
 print("面积为:${r.area}");
 }
 ​
 class Rect {
 var width;
 var height;
 ​
 Rect():width=3,height=10;
 ​
 get area {
 return this.width * this.height;
 }
 ​
 set aeraHeight(value) {
 this.height = value;
 }
 }
 ​
 //30

5.静态成员

使用static关键字来实现类级别的变量和函数,调用直接用类名调用

静态方法不能访问非静态成员,非静态方法可以访问静态成员

非静态方法必须实例化才能使用

 void main() {
 print(Person.name);
 Person.show();
 }
 ​
 class Person {
 static String name = "张三";
 static void show() {
 print(name);
 }
 }
 /*
 张三
 张三
 */

6.对象操作符

  1. ? 条件运算符(了解)

  2. as 类型转换

  3. is 类型判断

  4. ..级联操作(连缀)

 //======================is-================
 void main() {
  Person p = new Person();
 ​
  if (p is Person) {
    p.name = "Bob";
    p.getName();
  }
 }
 ​
 class Person {
  String name = "詹丹";
  int age = 24;
  void getName() {
    print("姓名:${this.name}-----年龄:${this.age}");
  }
 ​
  void setInfo(int age) {
    this.age = age;
  }
 }
 ​
 // ==========..=====================
 void main() {
  Person p = new Person();
  p
    ..name = "Jeny"
    ..age = 20
    ..getName();
 }
 ​
 class Person {
  String name = "詹丹";
  int age = 24;
  void getName() {
    print("姓名:${this.name}-----年龄:${this.age}");
  }
 ​
  void setInfo(int age) {
    this.age = age;
  }
 }
 ​
 //姓名:Jeny-----年龄:20

7.继承

  1. 子类通过extends关键字来继承父类

  2. 子类会继承父类可见的属性和方法,但是不会继承构造函数

  3. 子类能复写父类的方法,getter和 setter

 void main() {
  Web w = new Web('Bob', 12);
  w.getName();
 }
 ​
 class Person {
  var name;
  var age;
  Person(this.name, this.age);
  void getName() {
    print("姓名:${this.name}-----年龄:${this.age}");
  }
 }
 ​
 class Web extends Person {
  Web(super.name, super.age);//实例化子类给父类传参
 }
 ​
 //姓名:Bob-----年龄:12

子类定义属性和方法

 void main() {
  Web w = new Web('Bob', 12,'男');
  w.run();
 }
 ​
 class Person {
  var name;
  var age;
  Person(this.name, this.age);
  void getName() {
    print("姓名:${this.name}-----年龄:${this.age}");
  }
 }
 ​
 class Web extends Person {
  var sex;
  Web(super.name, super.age, String sex) {
    this.sex = sex;
  }
  run(){
    print("姓名:${this.name}---性别:${this.sex}-----年龄:${this.age}");
  }
 }
 //姓名:Bob---性别:男-----年龄:12

覆写父类的方法

 void main() {
  Web w = new Web('Bob', 12);
  w.getName();
 }
 ​
 class Person {
  var name;
  var age;
  Person(this.name, this.age);
  void getName() {
    print("姓名:${this.name}-----年龄:${this.age}");
  }
 }
 ​
 class Web extends Person {
  Web(super.name, super.age);
      @override //可写可不写,建议留下
      void getName() {
        print("${this.name},${this.age}");
      }
 }

子类方法调用父类方法

 void main() {
  Web w = new Web('Bob', 12);
  w.run();
 }
 ​
 class Person {
  var name;
  var age;
  Person(this.name, this.age);
  void getName() {
    print("姓名:${this.name}-----年龄:${this.age}");
  }
 ​
  work() {
    print("${this.name}的工作是程序员");
  }
 }
 ​
 class Web extends Person {
  Web(super.name, super.age);
  @override
  void getName() {
    print("${this.name},${this.age}");
  }
 ​
  run(){
    print("run");
    super.work();//调用父类的方法
  }
 }

3.抽象类

1.定义说明

抽象类通过abstract关键字来定义

Dart里抽象方法是没有方法体的方法;

抽象方法一定要在子类中实现

抽象类不能直接实例化,只有继承他的子类可以实例化

 void main() {
 var d = new Dog();
 d.eat();
 ​
 var c = new Cat();
 c.run();
 ​
 Animal p = new Cat();
 //p.run();  //p访问不到run,run属于Cat的私有方法
 }
 ​
 abstract class Animal {
 eat();
 run();
 }
 ​
 class Dog extends Animal {
 @override
 eat() {
 print("小狗正在吃鸡爪");
 }
 ​
 @override
 run() {
 print("小狗正在玩飞盘");
 }
 }
 ​
 class Cat extends Animal {
 @override
 eat() {
 print("小猫正在吃鱼干");
 }
 ​
 @override
 run() {
 print("小猫正在玩毛线团");
 }
 }
 ​
 /*小狗正在吃鸡爪
 小猫正在玩毛线团*/

2.Dart的接口实现

通过implements关键字实现

 //一个类继承多个接口
 void main() {
   C c = new C();
   c.printA();
   c.printB();
 }
 ​
 abstract class A {
   late String name;
   void printA() {
     print('A');
   }
 }
 ​
 abstract class B {
   void printB() {
    print('B');
   }
 }
 ​
 class C implements A, B {
   @override
   late String name;
 ​
   @override
   void printA() {
     print('A');
   }
 ​
   @override
   void printB() {
    print('B');
   }
 ​
 }
 ​
 //A
 //B
 ​

3.mixins

  1. 作为mixins的类只能继承自Object,不能继承其他类

  2. 作为mixins的类不能有构造函数

  3. 一个类可以mixins多个mixins

  4. mixins绝不是继承,也不是接口,而是一种全新的特性

 //继承和mixins一起
 class Person {
   String name;
   num age;
   Person(this.name, this.age);
   printInfo() {
     print('${this.name}----${this.age}');
   }
 ​
   void run() {
     print("Person Run");
   }
 }
 ​
 class A {
   String info = "this is A";
   void printA() {
     print("A");
   }
 ​
   void run() {
     print("A Run");
   }
 }
 ​
 class B {
   void printB() {
     print("B");
   }
 ​
   void run() {
     print("B Run");
   }
 }
 ​
 class C extends Person with B,A{
   C(String name, num age) : super(name, age);
 }
 ​
 ​
 void main() {
   var c = new C('张三', 20);
   c.printInfo();
   // c.printB();
   // print(c.info);
   c.run();
 }
 //张三----20
 //A Run (后面的会替换掉前面的,如果方法名一致的话)

4.泛型

1.定义

泛型就是解决类、接口、方法的复用性,以及对不特定数据类型的支持(类型校验)

 //对传入和返回的数据返回类型进行校验
 void main() {
   print(getData<double>(12));
 ​
   print(getData<String>("String"));
 }
 ​
 T getData<T>(T value) {
   return value;
 }
 /*
 12.0
 String
 */
 ​

案例:

 void main() {
   var num = new PrintClass();
   num.add(121);
   num.add(12);
   num.add(121);
   num.add(21);
   num.printInfo();
 }
 ​
 class PrintClass {
   List list = <int>[];
   void add(int value) {
     this.list.add(value);
   }
 ​
   void printInfo() {
     for (var i = 0; i < this.list.length; i++) {
       print(this.list[i]);
     }
   }
 }
 /*
 121
 12
 121
 21
 */
 //===============将以上改成泛类=================
 void main() {
   var str = new PrintClass<int>();
   str.add(2);
   str.add(5);
   str.add(7);
   str.add(21);
   str.printInfo();
 ​
 ​
   var num = new PrintClass<String>();
   num.add('香蕉');
   num.add('苹果');
   num.add('梨子');
   num.add('柠檬');
   num.printInfo();
 }
 ​
 class PrintClass<T>{
   List list = <T>[];
   void add(T value) {
     this.list.add(value);
   }
 ​
   void printInfo() {
     for (var i = 0; i < this.list.length; i++) {
       print(this.list[i]);
     }
   }
 }
 ​

2.泛型接口

实现数据缓存的功能:有文件缓存和内存缓存。都按接口约束实现

  1. 定义一个泛型接口,约束实现他的子类必须有getByKey(key)和setByKey(key,value);

  2. 要求setByKey里的value类型要和实例化子类的时候指定的类型一致。

 void main() {}
 abstract class Cache<T> {
   getByKey(String key);
   void setByKey(String key, T value);
 }
 ​

实现文件缓存和内存缓存

 void main() {
   MemoryCache m = new MemoryCache<String>();
   m.setByKey('index', "我是首页数据");
 ​
    MemoryCache m2 = new MemoryCache<Map>();
    m2.setByKey('index', {"name":"user","password":123456});
 ​
 }
 ​
 abstract class Cache<T> {
   getByKey(String key);
   void setByKey(String key, T value);
 }
 ​
 class FileCache<T> implements Cache<T> {
   @override
   getByKey(String key) {}
 ​
   @override
   void setByKey(String key, T value) {
     print('我是文件缓存,把key=${key} value=${value}的数据写到文件缓存之中了');
   }
 }
 ​
 class MemoryCache<T> implements Cache<T> {
   @override
   getByKey(String key) {}
 ​
   @override
   void setByKey(String key, T value) {
     print('我是内存缓存,把key=${key} value=${value}的数据写到内存缓存之中了');
   }
 }
 ​

5.库

1.第三方库

pub包管理系统

Dart packages

  1. 在官网找寻自己要的库

  2. 根目录创建一个pubspec.yaml的文件,内容如下:

  3. 配置dependencies

  4. 运行put get 获取远程库

  5. 看文档引入库使用

 name:"";
 description:A new flutter module project.
 dependencies:
   http: ^0.13.4

2.系统库

import "dart:math"

 void main() {
   print(min(22, 12));
 }
 //12

3.处理异步方法

async 和await 关键字,只有async方法才能使用await关键字调用,如果调用别的async方法,必须使用await。

 void main() async{
   var result = await test();
   print(result);
 }
 ​
 test() async{
   return '我是一个异步方法';
 }

4.库的重命名及使用

 import 'lib/person1.dart';
 import 'lib/person2.dart' as person2;
 void main(){
   Person p1 = new Person();
 ​
   person2.Person p2 = new person2.Person();
 }
 ​

5.部分导入

 import 'lib/person1.dart' show getName;
 //此时引入库只能使用getName方法
 ​
 ​
 import 'lib/person1.dart' hide getName;
 //此时该库getName方法不可以使用
 类似资料: