• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

flutter填坑之旅(dart学习笔记篇)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

俗话说 ‘工欲善其事必先利其器’ 想要撸flutter app 而不懂 dart 那就像一个不会英语的人在和英国人交流,懵!

安装 dart 就不用说了,比较简单dart 官网 https://dart.dev/

安装完成后就开启学习dart 旅程吧…

一、 首先得找个ide (总不能使用记事本撸吧),所以我们选择 idea 这个开发不错

1)idea 安装 dart (简单同直接 打开idea configure > plugins )

二、 创建一个项目开始 学习语法了


这里的dart-sdk 在dart官网直接下载就行,然后创建一个dart项目

void main(){
 	print("hello world! ");
 }

程序入口 main() 这就是java 风格

三、 数据类型

3.1 dart 变量

var :变量(任何类型)
const : 常量
final : 变量(只能赋值一次)

3.2 内置 类型

Number:数值型
String:字符串
Boolean:布尔型
List:列表
Map:键值对
另外还有 Runes 和Symbols 类型

定义数值型使用 num关键字 ,他主要包括 整形 int 和浮点型 double (这个就比java中的八大基本类型简单多了)

代码案例:

void main(){
  var name  = 'dex';

  const age = 22;
  final addr = "china";
  
  num a = 10;
  
  a = 12.5;
  
  int b = 20;
  
  double c = 10.5;
  
  print(c);
}

注意:每一行都要以 ; 结尾

3.3 数值型操作

1) 运算符 : + 、- 、* 、/ 、~/ 、%
其他都不用说和java 或者js都是相同的运用,唯有 ~/ : 是标识取余
2)常量属性:isNaN (是否非数字)、isEven(是否偶数)、isOdd(是否奇数)
3)常用方法:abs() (取绝对值)、round() (四舍五入)、floor() (向下取整【不大于基数】) 、ceil()(向上取整【不小于基数】)、toInt()、toDouble()

void main(){
  int age = 40;
  double score = 80.9;
  int grade = -5;

  print(score / age); // 2.0225
  print(score % age); // 0.9000000000000057
  print(score ~/ age); // 2

  print(score.floor()); // 80
  print(score.ceil()); // 81
  print(score.round()); // 81
  print(grade.abs()); // 5

  print(age.isEven); // true
  print(age.isOdd); // false 
  print(age.isNaN); // false 
}

3.4 字符串(String)

定义String 使用单引号、双引号、三个引号来定义字符串和 r 来创建原始的raw字符串

void main(){
  String article = ''' Hello welcome to 
                     dart develope ceter''';
  print(article); // Hello welcome to 
                   //                 dart develope ceter
                   
  // use r operator
  String caption = r" Hello \n Lilei !";
  print(caption); //  Hello \n Lilei !
}

字符串操作符 : + (字符拼接) 、* (字符按参数累加)、 == (字符比对)、 [](按下标获取数据)

void main(){
  String str = "This is my first proj";

  print(str * 5); // This is my first projThis is my first projThis is my first projThis is my first projThis is my first proj

  print(str[5]); // i
}

插值表达式 ${expression}

void main(){
 String name = 'jack';
 int age = 20;
 String addr = '四川成都';

 String information = '$name今年$age岁  来自${addr}' ;
 print(information); // jack今年20岁  来自四川成都
}

常用属性: length 、isEmpty 、isNotEmpty
常用方法:contains() 、subString() 、startsWith()、 endsWith() 、indexOf() 、lastIndexOf() 、toLowerCase() 、toUpperCase() 、trim() 、trimLeft() 、trimRight()、 split()、 replaceAll()、replaceFirst() … 这些同java中的Sting方法使用是相同的,这里就不累诉了

3.5 布尔型 bool

void main(){
 bool isNice = true;
 print(isNice); // true
}

3.6 List 列表/ 数组 (list 元素可以任意类型)

创建语法:

var list = [1,2,3,4,5,6];  // 普通list 创建
var list = const[1,2,3,4,5,6]; // 创建一个不可变list
var list = new List(); // 使用构造创建
void main(){
 var studentList = [1,2,3 ,"hello dart",true];

 print(studentList); // [1, 2, 3, hello dart, true]

 print(studentList[2]); // 3
 studentList[1] = 'Lilei';
 
 print(studentList); // [1, Lilei, 3, hello dart, true]

 var teacherList = new List();
  teacherList[0] = 'Macke'; // Unhandled exception: RangeError (index): Invalid value: Valid value range is empty: 0 (因为这个teacherList对象只有创建了,但还未开辟内存空间)
 teacherList.add( 'Macke');
 print(teacherList); // [Macke]
}

常用方法:[] 、length、 add()、 insert() 、remove() 、clear() 、indexOf()、 lastIndexOf() 、sort() 、sublist() 、shuffle()、 asMap() forEach() …

void main(){
  var hobbies = ["jog","swim","red"];
  hobbies.insert(1,"tourism");
  print(hobbies); // [jog, tourism, swim, red]

  print(hobbies.indexOf("tourism")); // 1

  hobbies.sort();

  print(hobbies); // [jog, red, swim, tourism]

  print(hobbies.sublist(1)); // [red, swim, tourism]

  hobbies.shuffle(); // 打乱元素
  print(hobbies); // [jog, tourism, red, swim]

  hobbies.forEach(print);// jog
                        // tourism
                        // red
                        // swim
}

3.7 Map (key-val可以任何类型)

语法:

var studyPlan = {'first':'Dart','second':'Flutter'}; // 创建普通map
var studyPlan = const{'first':'Dart','second':'Flutter'}; // 创建一个不可变map
var studyPlan = new Map();  // 使用构造函数创建
void main(){
  var studyPlan = {'first':'Dart','second':'Flutter','isHappy':true,true:'ok'};

  print(studyPlan); // {first: Dart, second: Flutter, isHappy: true, true: ok}

  print(studyPlan['first']); // Dart
  print(studyPlan[true]);// ok
  studyPlan[2] = false;
  print(studyPlan); // {first: Dart, second: Flutter, isHappy: true, true: ok, 2: false}
}

常用方法: []、 length、 isEmpty()、 isNotEmpty() 、Keys、 values containsKey()、 containsValue() 、remove()、 forEach()…

void main(){
  var studyPlan = {'first':'Dart','second':'Flutter','isHappy':true,true:'ok'};

   print(studyPlan.keys); // (first, second, isHappy, true)
   print(studyPlan.values); // (Dart, Flutter, true, ok)
   print(studyPlan.containsKey('first')); // true
   print(studyPlan.containsValue('Dart')); // true
   studyPlan.remove('isHappy');
   print(studyPlan); // {first: Dart, second: Flutter, true: ok}
   
   // 调用自定义proxyPrint方法进行map
   studyPlan.forEach(proxyPrint);// key=first,value = Dart
                                //  key=second,value = Flutter
                                //  key=true,value = ok

   var list = ['lili','lulu','xinxin'];
// asMap() 将使用下标作为key ,元素作为val然后将其转换为map对象
  print(list.asMap()); // {0: lili, 1: lulu, 2: xinxin}
}

void proxyPrint(key,value){
  print("key=$key,value = $value");
}

3.8 dynamic (动态类型【根据值自动更改变量类型】)

void main(){
  dynamic nickname = '小鱼儿';
  print(nickname); // 小鱼儿
  nickname = '雷震子';
  print(nickname); // 雷震子

  // 定义类型为泛型的list
  var generic = new List<dynamic>();
  generic.add(6);
  generic.add(8.8);
  generic.add('hello');
  generic.add(true);
  print(generic); // [6, 8.8, hello, true]
}

四、运算符

4.1 运算符

其中 + 、-、 *、 / 、||、 !、 && 、++、 – 、+=、-=、*=…这些同java 一样使用,其中特殊的赋值运算符中的 ??= (表示 变量如果原本无值及将右边值赋值于变量,如果变量原本有值就使用它原本的值)

void main(){
  int  time = 12;
  int hour = 10;

  hour ??= 18;
  print(hour); // 10

  int second ;
  second ??= 60;
  print(second); // 60
}

还有一个不同的是复合运算中的 ~/(取整)

void main(){
  int  time = 122;
  int hour = 10;
   print(time ~/ hour); // 12
}

4.2 条件表达式

1) 三目运算符: condition ? expression1 : expression2
2 ) ??运算符 expression1 ?? expression2 (如果expression1 不为空则取其值,反之取expression2的值)

  void main(){
  String goods = "apple";
  String toolLearn;
  String bag = goods ?? toolLearn;

  print(bag); // apple

  String grocery ;
  String shop = "boxes";
  String backpack = grocery ?? shop;

  print(backpack); // boxes

}

五、 控制语句

if…elseif…elseif…else这个和java控制语句相同 ,唯一一个不同的是switch … case 中可以使用continue 跳转到指定语句

void main(){
  String myHobby = "jog";

  switch(myHobby){
    case "game":
      print("my hobby is game");
      break;
    case "jog":
      print("my hobby is jog");
     continue Prefer;
    case "red":
      print("my hobby is red");
      break;
      Prefer:
    default:
      print("I like study different languages, haha!");
  }
  // print out :
  //  my hobby is jog
  // I like study different languages, haha!
}

六、 Function (方法)

6.1 方法定义

语法

返回值类型  方法名 (参数1、参数2...){
	方法体...
	return 返回值
}

这个同java 使用方式一样,不同的是他叫function 而不是 method ,还有个不同的是形参可以指定类型也可以不指定,这个有和JavaScript 的函数有定类似了

void main(){
 String info = getPersonInfo('Lili','18'); // error: The argument type 'String' can't be assigned to the parameter type 'int'.
 print(info);
}

String getPersonInfo (String name,int age){
  return "This girl's name is $name,she is $age years old";
}

如上你如果调用时参数类型不同就无法编译通过

void main(){
 String info = getPersonInfo('Lili','18');
 print(info); // This girl's name is Lili,she is 18 years old
}

String getPersonInfo ( name, age){
  return "This girl's name is $name,she is $age years old";
}

不指定参数类型也是被允许的

方法特性
1) 方法也是一个对象,并且具有具体类型 Function
2)返回值类型、参数类型都可以省略
3)箭头语法:=> expr{ return expr;} 的缩写 ,但是只适用于一个表达式
4)方法都有返回值。如果没有显示指定;它默认会在方法最后 return null

void main(){
  String info = getPersonInfo('Lili',18);
  print(info); // This girl's name is Lili,she is 18 years old
}

/*
   方法  getPersonInfo 的完整写法
    String getPersonInfo(Sting name, int age){
        return  "This girl's name is $name,she is $age years old";
    }
 */
getPersonInfo ( name, age) => "This girl's name is $name,she is $age years old";

哈哈 对js 熟悉的小伙伴看见这个箭头语法是不是感觉特亲切呢!

6.2 方法中的可选参数

1)可选命名参数:{parm1, param2, …}
2)可选位置参数:[parm1,param2, …]
可选的命名参数在调用时必须加上参数名进行实参传递如:

void main(){
  getPersonInfo('Lili'); // This girl's name is Lili, she is null years old and she lives in null 
  getPersonInfo('Lili',age: 18); // This girl's name is Lili, she is 18 years old and she lives in null 
  getPersonInfo('Lili',age: 18,addr: 'Chengdu, Sichuan, China'); //  This girl's name is Lili, she is 18 years old and she lives in Chengdu, Sichuan, China 
}
 getPersonInfo ( String name, {int age ,String addr}) => print("This girl's name is $name, she is $age years old and she lives in $addr ");


看过了可选命名参数,可选位置参数就不言而喻了(就是按参数位置下标进行实参–形参一一对应)

void main(){
  getPersonInfo("Lili"); // This girl's name is Lili, she is null years old and she lives in null 
  getPersonInfo("Lili",18,"Chengdu, Sichuan, China"); // This girl's name is Lili, she is 18 years old and she lives in Chengdu, Sichuan, China 
}
getPersonInfo ( String name, [int age ,String addr]) => print("This girl's name is $name, she is $age years old and she lives in $addr ");

还有一个可选参数必选放到必选参数后面(这个同ES6 的不定参数规则完全相同呵)

6.3 默认参数值 (使用 ‘=’ 指定)

void main(){
  getPersonInfo("Lili"); // This girl's name is Lili, she is 18 years old and she lives in Chengdu, Sichuan, China
}
getPersonInfo ( String name, [int age = 18 ,String addr = "Chengdu, Sichuan, China"]) => print("This girl's name is $name, she is $age years old and she lives in $addr ");

6.4 方法对象

1)方法可以作为对象赋值给其他变量
2)方法可以作为我参数传递给其他方法

void main(){
  Function func = printPersonalInfo;
  func(); // Hello world!

  var studentList = ["Binbin","Tingting","Mingmint"];

  // 将getEachFromList方法作为参数传递个forEach;进行元素打印
  studentList.forEach(getEachFromList); // Binbin
                              // Tingting
                             // Mingmint

  print(powerOperator(studentList,powerFn)); // [BinbinBinbinBinbin, TingtingTingtingTingting, MingmintMingmintMingmint]
}
printPersonalInfo() => print("Hello world!");
getEachFromList(val) => print(val);

powerOperator(List<String> list,String powerFn(str)){
    for(var i =0;i< list.length; i++){
     list[i] = powerFn(list[i]);
    }
    return list;
}

 String powerFn(str) => str*3;
 

6.5 匿名方法 (anonymous)

void main(){
 var fn = (){
    print("hello dart !");
  };
 fn (); // hello dart !

 // 定义一个自动运行方法,同js  (function($){}(window.document))()
 ((){
   print("I am an automated methed!"); // I am an automated methed!
 })();
  var studentList = ["Binbin","Tingting","Mingmint"];
  print(powerOperator(studentList,(str) => str * 3)); // [BinbinBinbinBinbin, TingtingTingtingTingting, MingmintMingmintMingmint]
}
printPersonalInfo() => print("Hello world!");
getEachFromList(val) => print(val);

powerOperator(List<String> list,String powerFn(str)){
    for(var i =0;i< list.length; i++){
     list[i] = powerFn(list[i]);
    }
    return list;
}

6.6 闭包

这个一直都是个难啃的骨头在js python 中都有它的身影,理解起来都是那么的不容易
理论:
1)闭包是一个方法(对象)
2)闭包定义在其它方法内部
3)闭包能够访问外部方法内的局部变量,并持有其状态

看这个最简单的例子:

void main(){
 var fnc = outsideFn();
 fnc(); // 0
 fnc(); // 1
 fnc(); // 2
 fnc(); // 3
 fnc(); // 4
 fnc(); // 5
}

outsideFn(){
  int count = 0;
  return (){
    print(count++);
  };
}

七、 面向对象(万物皆对象哈哈这是编程界的最高信仰)

7.1 类、对象

先背一下对象和类的概念
对象:用来描述客观事物的一个实体,由一组属性和方法构成
对象的静态特征称为对象的属性(用来描述对象静态的特征的一个数据项)
对象的动态特征称为对象的方法(对象的行为)

:定义了对象将会拥有的特征(属性)和行为(方法)
类属性:对象所拥有的静态特征在类中表示时称为类的属性(在类中定义对象的静态特征时)
类的方法:对象执行的操作称为类的方法

1) 使用 class 声明一个类(同 es6、java)
2) 使用关键字 new 创建对象(同 es6、java),new 可以省略
3) 所有对象都继承于Object类

属性与方法

1)属性默认会生成getter 和setter 方法
2)使用final申明的属性只有getter方法
3)属性和方法通过 . 访问
4)方法不能被重载 (这个和java不同)

void main(){
  var person = Person();
  person.name = "Wangxiaohu";
  person.age = 13;
  person
                      

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Dart简明教程发布时间:2022-07-14
下一篇:
FlutterDart回顾——异常捕获、抛出发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap