Dart语法学习1

前言 为什么学习Dart?


  1. Dart语法简洁高效,拥有数以千计的packages 生态系统

  2. Dart 提供提前编译优化,以在移动设备和 web 上实现可预测的高性能和快速启动

  3. Dart 可以编译成 ARM 和 x86 代码,因此 Dart 移动应用程序可以在 iOS,Android 及 更高版本上实现本地运行。 对于 web 应用程序,Dart 可以转换为 JavaScript

4.Dart 是面向对象的编程语言,语法风格对于许多现有的开发人员来说都很熟悉。 如果您有一定的面向对象编程语言的基础 ,那么使用 Dart 也就是分分钟的事情

5.Dart 可以便捷的进行响应式编程。由于快速对象分配和垃圾收集器的实现, 对于管理短期对象(比如 UI 小部件), Dart 更加高效。 Dart 可以通过 Future Stream 的特性和API实现异步编程。

  1. 同时也为Flutter学习打下一定的基础

二. 语言特点

1. Dart是一门纯粹的面向对象语言,在Dart中一切皆对象;函数(函数可以作为参数传递),字符串,数字等都是对象。

如下代码,数字可以调用对象方法

var text = 666.toString();
print(text);

函数作为对象传递

var list = [1, 2, 3];
  printEle(element) {
    print("输出值 is $element");
  }
 list.forEach(printEle);

系统函数forEach参数要求传一个函数

 /**
   * Applies the function [f] to each element of this collection in iteration
   * order.
   */
  void forEach(void f(E element)) {
    for (E element in this) f(element);
  }
2. Dart是一门强类型语言(js是一门弱类型语言),但也支持一些弱类型特性如:varobjectdynamic等;
  • var 实际上是编译器语法糖,声明变量后会自动推导类型,不可更改赋值类型

  • dynamic 表示动态任意类型,可以赋值任意类型,编译阶段不检测类型,被编译后是object类型

  • object 表示动态任意类型,可以赋值任意类型,编译阶段检查类型

  • 测试以下代码(可以打开注释,方便理解)*

  var p1 = 1;
  Object p2 = 2;
  dynamic p3 = 3;
  //p1 = 'A';编译期会报错;A value of type 'String' can't be assigned to a variable of type 'int'.
  // p1 = 'A';
  // p2,p3改变类型不会报错,因为都表示任意类型
  p2 = 'B';
  p3 = 'C';

//p2 因为Object编译期会检查类型,发现p2没有未定义 run函数 而报错 ;The method 'run' isn't defined for the type 'Object'.
  // p2.run();
//p3  dynamic编译器不检测类型,不会报错,运行时抛出异常;NoSuchMethodError: Class 'String' has no instance method 'run'.
  p3.run();
  print(p1);
  print(p2);
  print(p3);
  1. 兼具编译性语言特点和解释性语言特点
  • 对开发web应用来讲:dart会被转译成js
  • 对app、服务端、桌面应用讲:dart提供了开发模式,通过vm解释执行,支持热更新,具有解释型语言特点;也提供了生产模式,通过编译成机器码执行,具有编译型语言特点

三.开始学习吧

1. Dart支持以下基本数据类型:
  • Numbers
  • Strings
  • Booleans
  • List(数组)
  • Maps(字典键值对)


2. 变量声明:
  • 可以显示声明指明类型,方便编译器做一些静态检查如:
    int age = 18;
  • 可以var声明类型,变量初始化后自动推导类型,并且不可更改赋值类型
    var p1 = 1;
    注意以下写法也是正确的:
 var name;
  name = "无名氏";
  name = 18;
  name.run();
  print(name);

声明时不赋值则等同于声明了一个动态类型(dynamic)变量


  1. static final const关键字
  • static:用于修饰成员变量,这个变量是属于的,而不是属于对象的,除此之外没有其他别的含义了
  • final修饰的变量不许进行初始化,赋值之后不能再改变;编译期和运行期确定值都可以
  • const修饰变量,必须进行初始化,赋值之后不能再改变,该变量必须编译器就确定,否则会报错
getInfo() {
    return "个人信息";
  }

  const name = "我爱学习啊";
 //报错,因为编译期间不能确定info值;Const variables must be initialized with a constant value.
  const info = getInfo();

  final name1 = "我也爱学习";
//不报错
  final info1 = getInfo();

const还可以用来构造对象;表明该对象在编译期就能够完全确定,所以该对象类所有属性都必须使用final 或者 const修饰,也就是说该对象所有属性都是不能改变的既该对象是不可变的;

void main() {
  People p = const People("flutter");
}

class People {
  final name;
  const People(name) : this.name = name;
}

如果对象类属性不适用final修饰,则该对象某个属性是可变的,那么该对象就不能被称为是不可变的,所以会报错;

void main() {
  People p = const People("flutter");
}

class People {
  final name;
//也可以
  static const height = 180;
  int age;
//Can't define a const constructor for a class with non-final fields.
  const People(name) : this.name = name;
}

const构造集合,说明该集合完全不可变,类似OC中不可变集合;

  const array = const [1, 2, 3];
  array[0] = 0;
  //运行时报错;Unhandled Exception: Unsupported operation: Cannot modify an    unmodifiable list
  print(array);

相同的const变量,内存中只会创建一次

  var list1 = const [1, 2, 3];
  var list2 = const [1, 2, 3];
  //判断是否指向同一个对象
  bool result = identical(list1, list2);
  if (result) {
    print("是同一个对象");
  } else {
    print("不是同一个对象");
  }

输出flutter: 是同一个对象


  1. 变量未初始化的默认值:
    在Dart中未初始化变量都为null,null也是Object子类
  var name;
  int age;
  Object people;
  List list;
  dynamic dy;
  print(name);
  print(age);
  print(people);
  print(list);
  print(dy);

全输出null



5.类型判断:
a is Object去判断

//输出 true
print(null is Object);
//输出 true debug下输出,release忽略
assert(null is Object);


  1. 类型转换:
    Dart是强类型语言,所以需要显示转换。常见的转换:
  String aa = "111";
  //String-> int
  int bb = int.parse(aa);
  // int -> double
  double cc = bb.toDouble();
  // String -> double
  double dd = double.parse("1.1");
  // num -> String
  aa = cc.toString();
  //double指定位数 ->String
  String ee = 3.141592.toStringAsFixed(3); //结果为3.141
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342