Dart 速查表 codelab

字符串插值

为了将表达式的值放在字符串中,请使用${expression} 如果表达式为单个值就可以省略{}
列:

'${3+2}'                                '5'
'${"dart".toUpperCase}'                 'DART'
'$hiDart.toString()'                    'hiDart'

避空运算符

Dart提供了一系列方便的运算符来处理可能会为空得变量.其中一个是??=赋值运算符 当改变量为空时为其赋值;

int  d;
d ??= 100;
print(d); //---------->100

d  ?== 333;
print(d); //---------->100

??避空运算符,如果运算符左边表达式返回的是空值,则会计算右边表达式并且返回值

print(1??3); //------------>1
print(null??11); //--------------->11

条件属性访问

要保证可能为空的属性正常访问,可以在.的前面添加一个问号?

object?.someProperty;
//相当于
object!=null:object.somProperty:null

在一个表达式中可以连续使用多个 ?.

//当a 或者 a?.b 为空时,前面代码返回null并且不会调用c()
a?.b?.c();

集合字面量(Collection literals)

Dart内置了对list,map以及set的支持,你可以通过字面量直接创建他们:

final aListOfStrings = ['one','two','three'];
final aSetOfStrings ={'one','two','three'};
final aMapOfStringsToInts{
  'one':'1',
  'two':'2',
  'three':'3'
}

Dart的类型推断可以自动帮你分配这些变量的类型,这个例子中推断类型是List<String> , Set<String> 和Map<String,int>.
也可以手动写出

final aListOfInts = <int>[];
final aSetOfInts = <int>{};
final aMapOfIntToDouble = <int,double>{};

在使用子类型的内容初始化列表,但仍希望列表为List<BaseType> 时,指定齐类型很方便:

final aListOfBaseType = <BaseType>[SubType(),SubType()];

箭头语法

=> 这种箭头语法是一种定义函数的方法,该函数将在其右侧执行表达式并返回其值.

bool hasEmpty = aListOfStrings.any((any){
  return s.isEmpty;
});

bool hasEmpty = aListOfStrings.any((s) => s.isEmpty);

级连

要对同一对象执行一系列操作,请使用 ..

//在myObject上调用someMethod()方法,返回的结果是someMethod的值
myObject.someMethod();

//在myObject上调用someMethod()方法,但是结果返回不是该方法的返回值,而是myObject对象的引用
myObject..someMethod();

//使用级练 你可以将需要单独操作的语句链接到一起
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e)=> window.alert('Confirmed!'));

//使用级连能让代码更加简洁,而且在也不需要button变量了
querySelector('#confirm')..text = 'Confirm'..classes.add('important')..onClick.listen((e) => window.alert('Confirmed!'));

Getters and Setters

任何需要对属性进行更多控制而不是允许简单字段访问的时候,你都可以自定义getter 和 setter
你可以用来确保属性值合法:

class MyClass{
  int _aProperty = 0;
  int get aProperty => _aProperty;
  set aProperty(int value){
    if(value>=0){
        _aProperty =value;
    }
  }
}
//可以使用get来进行计算
class MyClass{
  List<int> _value = [];
  void addValue(int value){
    _value.add(value);
  }

  int get count{
    return _value.length;
  }
}

可选位置参数

Drat 有两种传参方法:位置参数和命名参数.

int sunUp(int a,int b,int c){
   return a+b+c;
}
int total = sunUp(1,2,3);

在dart中,你可以通过将这些参数包囊在大括号中使其变成可选位置参数:

int sumUpToFive(int a,[int b,int c,int d,int e]){
  int sum =  a;
  if(b!=null) sum+=b;
  if(c!=null) sum+=c;
  if(d!=null) sum+=d;
  if(e!=null) sum+=e;
  return sum;
}
int total = sumUpToFive(1,2);
int otherTotal = sumUpToFive(1,2,3,4,5);

可选参数永远放在参数列表最后.除非你给他提供一个默认的值,否则默认为null

可选命名参数

你可以使用大括号语法定义可选命名参数;

void printName(String firstName,String lastName,{String suffix}){
  print('$firstName $lastName ${suffix ?? ''}');
}

printName('Avinash', 'Gupta');
printName('Poshmeister', 'Moneybuckets', suffix: 'IV');

这些参数默认值为null,但是你可以为其提供默认值

void printName(String firstName, String lastName, {String suffix = ''}) {
  print('$firstName $lastName ${suffix}');
}

异常

Dart 代码可以抛出和捕获异常,与java相比,Dart所有的异常都是unchecked execption.方法不会声明他们可能抛出的异常,你也不需要捕获任何异常
虽然dart提供了exception 和 error 类,但你可以抛出任何非空对象

throw Exception('Something bad happened');
throw  'xxxxxxxxxxx';

使用tryon catch 关键字来处理异常

try{
  breedMoreLlamas();
} on OutOfLlamasException{
  buyMoreLlamas();
} on Exception catch(e){
  print('Unknown exception:$e');
} catch(e){
  print('Something really unknown: $e');
}

try关键字和其他大多数语言作用一样. 使用on关键字按类型过滤特定异常,而catch关键字则能捕捉到异常对象的引用;
如果你无法完全处理异常,请使用rethrow关键字再次抛出异常

try{
  breedMoreLlamas();
}catch(e){
  print('I was just trying to breed llamas');
  rethrow;
}

要执行一段无论是否抛出异常都会执行的代码,请使用finally;

try {
  breedMoreLlamas();
} catch (e) {
  … handle exception ...
} finally {
  // Always clean up, even if an exception is thrown.
  cleanLlamaStalls();
}

在构造方法中使用this

Dart 提供了一个方便的快捷方式,用于为构造方法中的属性赋值:在声明构造方法时使用this.propertyName

class MyColor{
  int red;
  int green;
  int blue;
  MyColor(this.red,this.green,this.blue)
  
}
final color = MyColor(33,33,33);

此技巧同样也适用于命名参数。属性名为参数的名称:

class MyColor {
  ...

  MyColor({this.red, this.green, this.blue});
}

final color = MyColor(red: 80, green: 80, blue: 80);

对于可选参数,默认值为期望值:

MyColor([this.red = 0, this.green = 0, this.blue = 0]);
// or
MyColor({this.red = 0, this.green = 0, this.blue = 0});

Initializer lists

有时,当你在实现构造函数时,您需要在构造函数体执行之前进行一些初始化。例如,final 修饰的字段必须在构造函数体执行之前赋值。在初始化列表中执行此操作,该列表位于构造函数的签名与其函数体之间:

Point.fromJson(Map<String, num> json)
    : x = json['x'],
      y = json['y'] {
  print('In Point.fromJson(): 

初始化列表也是放置断言的便利位置,它仅会在开发期间运行:

NonNegativePoint(this.x, this.y)
    : assert(x >= 0),
      assert(y >= 0) {
  print('I just made a NonNegativePoint: ($x, $y)');
}

命名构造方法

为了允许一个类具有多个构造方法,Dart支持命名构造方法;

class Point{
  num x,y;
  Point(this.x,this.y);
  Point.origin(){
    x=0;
    y=0;
  }
}

为了使用命名构造方法,请使用全命名调用它;

final myPoint = Point.origin();

工厂构造方法

Dart 支持工厂构造方法, 它能够返回其子类甚至null对象.要创建一个工厂构造方法,请使用factory关键字.

class Square extends Shape{}
class Circle extends Shape{}

class Shape{
  Shape();
  factory Shape.formTypeName(String typeNmae){
      if(typeName == 'square') return Square();
      if(typeName == 'circle') return Circle();
      print('I don\'t recognize $typeName');
      return null;
  }
}

重定向构造方法

有时候一个构造方法仅仅用来重定向到该类的另外一个构造方法,重定向方法没有主体.它在冒号:之后调用另外一个构造方法

class Automobile{
  String make;
  String model;
  int mpg;
  Automobile(this.make,this.model,this.mpg);
  
  Automobile.hybrid(String  make,String model):this(make,model,60);

  Automobile.fancyHybrid():this.hybrid('Futurecar','Mark 2');
}

Const构造方法

如果你的类生成对象永远都不会改变,则可以让这些对象成为编译时常量.为此定义const构造方法并且确保所有实例变量都是final;

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

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,732评论 2 9
  • Dart重要概念:1,在变量中可以放置的所有东西都是对象,而每个对象都是类的实例。无论数字、函数、和null都是对...
    哥哥是欧巴Vitory阅读 789评论 0 1
  • 此文章是v1.0+时编写,年代久远,小心有毒,谨慎食用!!! 一些重要概念 所有的东西都是对象,所有的对象都是类的...
    soojade阅读 10,040评论 2 27
  • 上一篇: 一、Flutter环境搭建下一篇: 三、Flutter基础—ListView入门 我之前只有OC开发经...
    OOOlive阅读 4,137评论 4 13
  • Dart语言详解 变量-变量的声明 区别于java,新增 var dynamic Object var:如果没有初...
    小流星雨阅读 1,434评论 1 2