Android Flutter(二)Dart语言学习

这里我使用的使用的VSCODE软件,非常轻量,推荐。这里基本只会提和java之间的区别。

1. 简单尝试

  • 打开 vscode ,安装一下dart插件和CodeRunner插件


  • new一个File,我这里是test1.dart。这里dart语言文件的后缀名就是dart。
  • 写一个最简单的dart语句试试:



    右键就可以运行了,这里注意必须CtrlS之后运行,没有类似AS的自动保存功能,直接运行是没有反应的。



    运行成功。

2. 语法

Dart在语法方面感觉和JavaScript,和Java非常相似。

  • 变量

它是一种功能非常强大的脚本语言,可以不定义变量类型,自动对类型推导。

 void main() {
  var str = 'hello dart!';
  String str1 = 'hello world!';
  print(str);
  print(str1);
}
  • 常量

Dart中常量定义有两个关键词:constfinal
但是这两者还是有区别的,看下下面代码,其中const修饰的常量报错了。

void main() {
  const a = "Hello";

  final b = "world";

  // const time = new DateTime.now(); 报错

  final time2 = new DateTime.now();
}
  • const是编译时常量
  • final拥有const的特性,并且还是运行时常量,final常量是惰性的,只有在第一次运行的时候才会被初始化
    获取当前时间的行为无法在编译期间操作,所以const报错了。
  • 命名规则

和java一样

  • 常用数据类型
  • int
  • double
  • bool
  • String
  • List
  • Map
  • Sting类型
    和Java不同的是String数据类型添加了新的特性,3个双引号或者3个单引号成对出现,字符串内容可以换行显示。
void main(){
  String s = """
  hello,
  world!
  hello,
  dart!
  
  ......
  """;
  print(s);
}

结果:


  • 运算符

比起JAVA,多出了一个特殊运算符:当b没有被赋值时,??=的赋值才会生效。

void main(){
  //  var b;
  //  b??=2;
  //  print(b);//2

   var b = 7;
   b??=2;
   print(b);//7
}
  • 类型转换
void main(){
  var a = "123";
  try{
    var b = double.parse(a);
     print(b);//123.0
     print(b.toString());//double -> String 123.0
  }catch(err){
    print(0);
  }
  var n = 0/0;
  print(n);//NaN
  if(n.isNaN){
    print("chucuole");
  }
}
  • 函数
  1. 函数定义方式
    可以不写返回值类型,把int去掉,但是最好加上类型约束,才符合代码规范。
int getNum(int num){
    var a = 0; 
    for(int i= 0;i<num;i++){
      a = a + i;
    }
    return a;
}
  1. 箭头函数
void main(){
  var list = ["a","b","c"];
  // list.forEach((v){
  //   print(v);
  // });

  // list.forEach((v) => print(v));
  list.forEach((v) =>{
    print(v)
  });
 List list1 = [1,3,5,7,8,9];
  // var newList = list1.map((v){
  //   if(v>5){
  //     return v;
  //   }
  //   return "";
  // });
  var newList = list1.map((v) =>v>5?v:0);
  print(newList);//(0, 0, 0, 7, 8, 9)
}

  • 闭包

局部变量特点: 1. 不污染全局 2. 会被内存回收
闭包使用:使变量常驻内存 但是不会污染全局


void main(){
  fn(){
    var a = 1;
    return (){
      a++;
      print(a);
    };
  }
  var b = fn();
  b();
  b();
  b();
}

  • 构造函数
  1. 简化了赋值操作
class Person{
  String name;
  int age;
  Person(this.name,this.age){

  }
  info(){
    print("${name}---${age}");
  }
}
void main(){
  var p = new Person("haha", 18);
  p.info();//haha---18
}
  1. 比起Java新增了命名构造函数,同时构造函数时不可重载的,算是一个替代吧。
class Person{
  String name;
  int age;
  Person.now(){
    print("命名构造函数");
  }
  Person(this.name,this.age){
      
  }
  info(){
    print("${name}---${age}");
  }
}
void main(){
  var p = new Person("haha", 18);
  p.info();//haha---18
  var p1 = new Person.now();//命名构造函数
}
  • 私有属性,私有类,私有方法

和Java不同,dart中是没有private,protected,public这种关键词的,dart中只要。。加一个下划线就可以了。

其实在前面的学习里我也隐隐感觉到dart可能是个符号狂魔。。但是,好吧,看一下例子。

class Person{
  String _name;//私有了
  int age;
  Person.now(){
    print("命名构造函数");
  }
  Person(this.name,this.age){
      
  }
  _info(){//私有了
    print("${name}---${age}");
  }
}
  • get,set方法

dart中的get,set方法更像把他作为一个类的属性来进行实现。


class Rect{
  int mH;
  int mW;
  set areaH(value){
    mH = value;
  }

   set areaW(value){
    mW = value;
  }
  get area{
    return mH*mW;
  }
}
void main(){
  var r = new Rect();
  r.areaH = 5;
  r.areaW = 10;
  print(r.area);//50
}

定义和调用都不需要括号,是不是特别像static修饰了一样。

  • 静态方法

和JAVA一样,用static修饰

  • 类的继承
  1. 和Java一样使用extends关键词
  2. 子类不能继承父类的构造方法
  3. 子类能复写父类的方法
class Person{
  String name ;
  int age;
  Person.now(this.name,this.age){

  }

  void getInfo(){
    print("${name}---${age}");
  }

  void work(){
    print("${name}在工作...");
  }
}
class Worker extends Person{
  Worker.now(String name, int age) : super.now(name, age);

  @override
  void work(){
    print("${name}是童工...");
  }
}

void main(){
  var worker = new Worker.now("xiaoming",15);
  worker.work();//xiaoming是童工
}

  • 抽象类和接口
  1. dart中抽象类修饰也是使用abstract
  2. 方法不需要abstract修饰,没有方法体就是抽象方法
abstract class A{
  b();
}

这里b就是抽象方法。
这里dart的抽象类替代了接口的作用,没有interface这个关键词。你可以理解为dart用抽象类代替了接口。
如果要将抽象类当作接口使用,关键词使用implement即可。

  • 多继承

众所周知,一个类可以继承多个接口,但是不能继承多个抽象类。
dart加入了一个新特性mixins,可以实现类似多继承的功能,但是他不是继承,也不是接口。


abstract class A{

  printA(){
    print("A");
  }
}

abstract class B{
  printB(){
    print("B");
  }
}

abstract class D{
  printD(){
    print("D");
  }
}


class C  with A,B{
}


void main(){
  var c = new C();
  c.printA();//A
  c.printB();//B
}

这里我做了个实验,如果两个被混淆的类有同名方法会发生什么呢?
结论是后一个被混淆的类中的方法会生效,类似方法重载。
对于mixins类,有几个重要的特性,需要注意。

  1. 不能拥有构造函数,拥有构造函数的类是无法被混淆的。
  2. 继承可以和混淆混合使用。
  3. 如果用 C is A或者 C is B去做类型判断,你会发现返回的都是true
  • 泛型
  1. 定义泛型方法,解决代码复用问题
T getNum<T>(T n){
  return n;
}


void main(){
   print(getNum(""));
  print(getNum<String>("1"));//可以指定类型

}
  1. 定义泛型类class List<T>

泛型类中一个比较明显的例子就是List

var list = new List<String>();
  1. 定义泛型接口
  • 定义一个泛型接口,约束实现他的子类必须有getByKey(key)setByKey(key,value)
  • setByKey(key,value)中的value值必须和泛型规定的数据类型一致。
abstract class A<T>{
  void setByKey(String key,T value);
  getByKey(key);
}

class Test<T> implements A<T>{
  @override
  getByKey(key) {

    return null;
  }

  @override
  void setByKey(String key, T value) {
  
  }

}
  • 关键词 async 和 await
  1. async的作用就是让方法异步。
    2.如果使用别的async就要用到await
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容

  • Flutter日渐火爆,因此在进行Flutter学习前先学习一些其所使用的开发语言dart的基础,这篇文章主要学习...
    Samlss阅读 10,952评论 2 28
  • 一. Dart入口方法 每一个flutter项目的lib目录里面都有一个main.dart。这个文件就是flutt...
    骑马纵天下阅读 2,530评论 0 1
  • Dart重要概念:1,在变量中可以放置的所有东西都是对象,而每个对象都是类的实例。无论数字、函数、和null都是对...
    哥哥是欧巴Vitory阅读 803评论 0 1
  • 此文章是v1.0+时编写,年代久远,小心有毒,谨慎食用!!! 一些重要概念 所有的东西都是对象,所有的对象都是类的...
    soojade阅读 10,061评论 2 27
  • 在Dart中,一切都是对象,一切对象都是class的实例,哪怕是数字类型、方法甚至null都是对象,所有的对象都是...
    彡廿阅读 88,143评论 32 229