Loading... # 基础的 用于给有一部分语言基础的人群以及我进行复习、快速入门了解 教程记录内容来自 `IT营`以及查阅的部分资料 [Dart Flutter教程_Dart Flutter3.x入门实战视频教程-16讲以后是Flutter教程-2022年9月重录](https://www.bilibili.com/video/BV1S4411E7LY?p=3&vd_source=5657c76e8b071e6bf2f96f1348655c44) ## main方法 dart的入口方法(两种) ```dart main(){ print('你好'); } ``` 表示main方法没有返回值 ```dart void main(){ print('你好'); } ``` ## 注释 可以通过//、/**/,///进行注释 ## 变量 声明变量可以通过 `var`关键词或者 `静态类型`关键词进行变量声明使 <div class="tip inlineBlock warning"> 用var定义变量,表示该变量交由编译器进行推断决定,但并不建议大量使用var关键词定义变量,在代码补全或编译警告时的提示会让你摸不着头脑 </div> ```dart void main(){ //var声明变量 var str='你好'; var myNum=1234; print(str); print(myNum); //类型关键词声明变量 String str1='你好'; int myNum1=1234; print(str1); print(myNum1); } ``` Dart中,未初始化的变量都是 `null`,且所有类型都是对象类型,继承自顶层类型Object ## 常量 常量不可改变,在dart中有两个定义常量的关键词 `const`、`final` ```dart void main(){ const a=1234; final b=123456; //const和final区别 //const a1=new DateTime.now(); //获取当前的时间给常量a1,会报错 final b1=new DateTime.now(); //获取当前的时间给常量b1,正常运行 } ``` <div class="tip inlineBlock share"> const是在编译时期就确定下来的常量;final是在运行时期确定下来的 </div> # 数据类型 num、string、bool、list、map(项目中不常用的数据类型还有runes、symbols) ## num `num`是64位 `int`、符合IEEE 754 标准的64位 `double`的父类   ```dart void main(){ int a= 123; double b= 123.123; print(a); print(b); } ``` `<div class="tip inlineBlock warning simple"> num类`除了是int、double的父类外,还提供了 + - * / % ~/ < <= > >=等运算符、以及abs()、round()等方法,可以自行查阅源码了解 </div> ## 字符串String ```dart void main(){ String a="你好"; String b='你好'; //单引号和双引号均可,但是只能写一行 String c="""你好 啊哈 """; String d='''你好 啊哈 '''; //三个单引号或者双引号可以写多行 print("$a$b"); print(c+" "+d); //字符串的拼接 } ``` ## 布尔类型bool 只存在true和false ```dart void main(){ bool a=true; bool b=false; print(a); print(b); } ``` ## 集合类型list 第一种,list中里面可以丢任何的数据类型 ```dart void main(){ var l1=["张三",20,true]; print(l1);//打印结果为[张三,20,true] print(l1.length); //打印集合中有多少个元素,打印出3 print(l1[0]);//打印索引值为0的值,打印结果为张三 } ``` 第二种定义list的方式,指定类型 ```dart void main(){ var l2=<String>["张三","李四"]; //不能写入除了string类型的其他类型 print(l2); } ``` 第三种定义list的方式 增加数据 ```dart void main(){ var l4=[]; print(l4); print(l4.length); l4.add("张三"); //增加张三这个数据 l4.add("李四"); l4.add(20); print(l4); } ``` 第四种定义list的方式 ```dart void main(){ var l6=new list(); //通过new list定义list。新版本中已被废弃 } ``` ```dart void main(){ var l6=List.filled(2,""); //创建一个固定长度的集合 print(l6); l6[0]="李四"; l6[0]="张三"; //修改数据 print(l6); //l6.add("王五"); //会报错,指定长度为2,无法增加了 //尝试修改集合的长度 //l6.length=0; //修改集合的长度,会报错,通过list。filled创建的集合长度是固定的 var l7=["张三",“李四”]; print(l7); l7.length=0; print(l7); //通过中括号创建的list长度可以修改 var l8=List<String>.filled(2,"");//指定类型 var l8l=<String>["张三"]; } ``` <div class="tip inlineBlock share"> `filled`可以通过 `List<dynamic>.filled()`储存任意类型 </div> ## Maps类型 第一种定义Maps的方式 ```dart void main(){ var person={ "name":"张三", "age":20, "work":["程序员","送外卖"] }; print(person); print(person["name"]); print(person["age"]); print(person["work"]); } ``` 第二种定义Maps的方式 ```dart void main(){ var p=new Map(); p["name"]="李四"; p["age"]=20; p["work"]=["程序员","送外卖"]; print(p); print(p["age"]); } ``` ## Runes类型 略 ## Symbols类型 略 # Dart 判断数据类型 ## is关键词判断类型 ```dart void main(){ var str = "123"; if(str is String){ print("是string类型"); }else{ print("其他类型"); } } ``` # 运算符、条件判断、类型转换 运算符与其他编程语言基本一致 ## 运算符 | 算术运算符 | 含义 | 关系运算符 | 含义 | 逻辑运算符 | 含义 | 赋值运算符 | 含义 | | ---------- | ---- | ---------- | -------- | ---------- | ---- | ---------- | ------------------ | | + | 加 | == | 等于 | ! | 取反 | = | 右边的值赋给左边 | | - | 减 | != | 不等于 | && | 且 | ??= | 一个变量为空则赋值 | | * | 乘 | > | 大于 | 丨丨 | 或 | | | | / | 除 | < | 小于 | | | | | | % | 取余 | >= | 大于等于 | | | | | | ~/ | 取整 | <= | 小于等于 | | | | | ## 条件判断 可以通过 `print()`进行判断,返回false或true,代码如下(试了下c貌似不能直接这样写) ```dart void main(){ int a = 5; int b = 3; print(a==b); //输出false print(a!=b);//输出true print(a>b);//输出true print(a<b);//输出false print(a>=b);//输出true print(a<=b);//输出false } ``` ## 条件表达式 ### if() 通过 `if()`来判断 ```dart void main(){ int a = 5; int b = 3; if(a==b){ print("相等"); }else{ print("不相等"); } } ``` ### switch...case 不给例子了,和c是一样的 ## 三目运算符 `格式为:变量?真:假` ## 类型转换 ## number与string类型的转换 通过 `toString()`关键词转换 ```dart void main(){ int myNum=123; var str=myNum.toString(); print(str is String); } ``` ## string与number类型的转换 通过 `int.parse()`关键词或者 `double.parse()`关键词转换 ```dart void main(){ String str ="123"; var myNum=int.parse(str); print(myNum is int); } ``` ## 其他类型转Booleans类型 isEmpty可以判断字符串是否为空 ```dart void main(){ var str="xxx"; if(str.isEmpty){ print("str为空"); }else{ print("str不为空"); } } ``` <div class="tip inlineBlock warning"> 0/0会输出NaN,可以通过 `isNaN`关键词判断 </div> # 循环语句 这里有基础可以跳过了,讲的都是基础用法,部分和我学过的有出入或者我没接触过的我会再写出来 语句是for、while、do...while、break、continue这些 这个也可以做到循环list ```dart void main(){ List myList=['草莓','西瓜','苹果']; for(var item in myList){ print(item); } } ``` # List、Set、Map详解 介绍List、Maps里常用的属性与方法以及Set的使用 `PS:写下的方法不一定是专属的,例如toList在maps和set是都可以使用的` ## List 例子如下,可以自己敲代码运行看看效果 ```dart void main(){ List l1 = ["张三"]; print(l1.length); } ``` | 常用方法 | 作用 | | --------------------- | -------------------------------------- | | add | 增加一个 | | addAll | 拼接数组 | | indexOf | 查找 传入具体值 | | remove | 删除 传入具体值 | | removeAt | 删除 传入索引值 | | fillRange | 修改 | | insert(index,value) | 指定位置插入 | | insertAll(index,list) | 指定位置插入List | | toList() | 其他类型转换成List | | join() | List转换成字符串,括号内填以什么分割 | | split() | 字符串转化成List,,括号内填以什么分割 | 例子如下,可以自己敲代码运行看看效果 ```dart void main(){ List l1 = ["张三"]; l1.add("草莓"); l1.addAll(["西瓜","橙子"]); print(l1.indexOf("西瓜")); //查不到会返回-1,查到就返回索引值 l1.fillRange(1,3,'aaa'); //修改了2和3,(1,3] //------------- } ``` ## Set 主要功能是去除数组重复的内容,set是没有顺序且不能重复的集合,所以不能通过索引值获取 ```dart void main(){ var s=new Set(); s.add('香蕉'); s.add('苹果'); s.add('香蕉'); print(s); //重复的只显示一个 print(s.toList()); //转换为list } ``` ## Maps maps是无序的键值对 | 常用属性 | 作用 | | ---------- | ----------------- | | Keys | 获取所有的key值 | | values | 获取所有的value值 | | isEmpty | 是否为空 | | isNotEmpty | 是否不为空 | 例子如下,可以自己敲代码运行看看效果 ```dart void main(){ Map l2 = { "name":"张三", "age":20 }; print(l2.Keys.toList()); //获取所有key数据并且转换为list } ``` | 常用方法 | 作用 | | ------------- | ----------------------------- | | remove(key) | 删除指定key的数据 | | addAll({...}) | 合并maps,给maps内增加属性 | | containsValue | 查看maps内的值 返回true/false | 例子如下,可以自己敲代码运行看看效果 ```dart void main(){ Map l2 = { "name":"张三", "age":20 }; l2.addAll({ "work":["送外卖"], "height":168 }); print(l2); } ``` ## 循环方法 | 循环语句 | 作用 | | -------- | ------------------------------------- | | forEach | 循环遍历数据,List只能传入一个值 | | map | 修改循环 | | where | 循环出来满足条件的 | | any | 有一个满足条件就返回true,反之false | | every | 每一个都满足条件就返回true,反之false | ### forEach ```dart void main(){ List mylist = ["张三","李四"]; mylist.forEach((value){ print("$value"); }); } ``` ### map ```dart void main(){ List mylist = [1,3,4]; var newlist=mylist.map((value){ return value*2; //(){}可以写多行代码,(value){代码} }); print(newlist.toLIst()); } ``` ### where ```dart void main(){ List mylist = [1,3,4,5,6,7,8,9]; var newlist=mylist.where((value){ return value>5; //(){}可以写多行代码,(value){代码} }); print(newlist.toLIst()); } ``` ### any ```dart void main(){ List mylist = [1,3,4,5,6,7,8,9]; var f=mylist.any((value){ return value>5; //(){}可以写多行代码,(value){代码} }); print(f); } ``` ### every ```dart void main(){ List mylist = [1,3,4,5,6,7,8,9]; var f=mylist.every((value){ return value>5; //(){}可以写多行代码,(value){代码} }); print(f); } ``` ## 报错抛出异常的处理 可以通过 `try catch`实现 ```dart void main(){ String price=''; try{ var myNum=double.parse(price); print(myNum); }catch(err){ print("错误代码0"); } } ``` <div class="tip inlineBlock warning"> 有一行代码可以通过使用箭头函数 `()=>`,多行代码可以使用 `(变量){代码}` </div> # 函数/方法 dart是一门面向对象的语言,相对于java来说会有些不同,可以接着往下看 ## 函数 函数在dart中也是对象,类型为 `Function`,这意味着函数也可以定义为变量,也可以被定义位参数传递给另一个函数。 ```dart int add(int a,int b){ return a+b; } void printInfo(int a ,int b , Function add){ print("$a + $b 的和 为 ${add(a,b)}"); } void main(){ Function f = add; //函数可以定义为变量 int a = 5; int b = 6; printInfo(a,b,add); //函数也可以被定义为参数传递给另一个函数 } ``` ## 重载? dart认为重载会导致混乱(其实我个人也觉得),因此设计之初就不支持重载,但提供了两个代替的方式 在Java中,重载大概都不陌生,使用重载我们需要在同一个类中方法名同,但参数列表不同,从而实现重载。 因此在dart中,提供了 `可选命名参数`、`可选参数` ### 可选命名参数 我们可以通过给参数加{},以 paramName: value 的方式指定调用参数。 ```dart void test(int a , bool b , {String c , List d}){ print("$a , $b ,$c ,$d"); } void main (){ test(1,true); // 1 , true ,null ,null } ``` 但是你会发现,诶,那我需要给不传的两个变量在不传递的时候进行初始化可以吗?答案肯定是可以的 ```dart void test(int a , bool b , {String c = 'test' , List d = const [1,2,3] }){ print("$a , $b ,$c ,$d"); } void main (){ test(1,true); } ``` <div class="tip inlineBlock warning simple"> 其中需要注意的是,可选命名参数为List类型,且你需要该List类型有默认值时,需要在 = 后面添加const关键词,否则会报错 </div> 你需要传递参数的话,需要将形参的名称写上去 ```dart void test(int a, bool b, {String c = 'test', List d = const ['1', '2']}) { print("$a , $b ,$c ,$d"); } void main() { test(1, true,c: 'abc',d: [1,2,3]); } ``` <div class="tip inlineBlock warning simple"> **在 Flutter 中会大量用到可选命名参数的方式,一定要记住它的用法** </div> ### 可选参数 可选参数与可选命名参数类似,但也有不同。 给参数增加 `[]`,则意味着这些参数是可以忽略的,也就是可选参数。即将{}改为[]就是可选参数 且使用可选参数的时候,我们传入需要的参数时,不需要将形参名称写出来,直接传递即可 ```dart void test(int a, bool b, [String c = 'test', List d = const ['1', '2']]) { print("$a , $b ,$c ,$d"); } void main() { test(1, true, 'abc', [1, 2, 3]); } ``` # 类 dart声明类的方式与java稍有不同,其中dart没有public、protected、private、interface这些关键词。 如果我们需要限制变量以及方法的访问级别时,只需要在变量或方法的前面加上 `"_"`即可,**但其范围并不是类访问级别的,而是库访问级别**。 持续码字中.... Last modification:October 19, 2024 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 6 如果觉得我的文章对你有用,请随意赞赏
One comment
哈哈哈哈