美文网首页
Dart语法简要

Dart语法简要

作者: pisfans | 来源:发表于2020-01-15 16:10 被阅读0次

Dart语法和java很接近,本篇就简要列出Dart不同的几点
首先看下常见的helloword

//main标准写法
void main() {
  print('Hello World!');//注意: Dart和Java一样表达式以分号结尾
}
//dart中所有函数的类型都是可以省略的,省略的时候返回值类型为dynamic
main() {
  print('Hello World!');  
}
//如果函数内部只有一个表达式,可以省略大括号,使用"=>"箭头函数; 
void main() => print('Hello World!');
//最简写形式
main() => print('Hello World!');
数据类型

在dart中的一切皆是对象,包括数字、布尔值、函数等,它们和Java一样都继承于Object, 所以它们的默认值也就是null.
在dart主要有: 布尔类型bool、数字类型num(数字类型又分为int,double,并且两者父类都是num)、字符串类型String、集合类型(List, Set, Map)、Runes类和Symbols类型(后两个用的并不太多)

double pi = 3.141592653;
int width = 200;
int height = 300;
print(width / height);//注意:这里和Kotlin、Java都不一样,两个int类型相除是double类型小数,而不是整除后的整数。
print(width ~/ height);//注意: 这才是dart整除正确姿势
print(666.6.toInt()); //666.6 转化成int
字符串类型(String)

在Dart中支持单引号、双引号、三引号以及$字符串模板用法和Kotlin是一模一样的。

String description = """
          Hello Dart! Hello Dart!
          Hello Dart!
          Hello Dart! Hello Dart!
    """;//三引号
num value = 2;
String result = "The result is $value";//单值引用
num width = 200;
num height = 300;
String square = "The square is ${width * height}";//表达式的值引用
类型检查(is和is!)和强制类型转换(as)
print(number is num);//true
print(distance is! int);//true
print(age as int);//18
var,final,const
var color; // 仅有声明未赋值的时候,这里的color的类型是dynamic,所以它的类型是可以变的
var colorKey = 'black'; //var声明变量 自动根据赋值的类型,推导为String类型,不能变成其他类型了
const PI = 3.141592653;//编译期就能初始化
final nowTime = DateTime.now();//运行时期初始化的
空安全运算符

result = expr1 ?? expr2
若expr1为null, 返回expr2的值,否则返回expr1的值

expr1 ??= expr2
若expr1为null, 则把expr2的值赋值给expr1

result = expr1?.value
若expr1为null, 就返回null,否则就返回expr1.value的值

级联操作符(..)

对一个对象中字段进行链式调用
question
..id = '10001'
..stem = '第一题: xxxxxx'
..choices = <String> ['A','B','C','D']
..hint = '听音频做题';

函数

函数参数列表传参规则

//num a, num b, num c, num d 最普通的传参: 调用时,参数个数和参数顺序必须固定
add1(num a, num b, num c, num d) {
  print(a + b + c + d);
}

//[num a, num b, num c, num d]传参: 调用时,参数个数不固定,但是参数顺序需要一一对应, 不支持命名参数
add2([num a, num b, num c, num d]) {
  print(a + b + c + d);
}

//{num a, num b, num c, num d}传参: 调用时,参数个数不固定,参数顺序也可以不固定,支持命名参数,也叫可选参数,是dart中的一大特性,这就是为啥Flutter代码那么多可选属性,大量使用可选参数
add3({num a, num b, num c, num d = 100}) {
  print(a + b + c + d);
}

//num a, num b, {num c, num d}传参: 调用时,a,b参数个数固定顺序固定,c,d参数个数和顺序也可以不固定
add4(num a, num b, {num c, num d}) {
  print(a + b + c + d);
}

main() {
  add1(100, 100, 100, 100); //最普通的传参: 调用时,参数个数和参数顺序必须固定
  add2(100, 100); //调用时,参数个数不固定,但是参数顺序需要一一对应, 不支持命名参数(也就意味着顺序不变)
  add3(
      b: 200,
      a: 200,
      c: 100,
      d: 100); //调用时,参数个数不固定,参数顺序也可以不固定,支持命名参数(也就意味着顺序可变)
  add4(100, 100, d: 100, c: 100); //调用时,a,b参数个数固定顺序笃定,c,d参数个数和顺序也可以不固定
}

在dart函数也是一种类型Function,可以作为函数参数传递,也可以作为返回值。

构造函数
abstract class Person {
    String name;
    int age;
    double height;
    //注意,这里写法可能大家没见过, 这点和Java是不一样,这里实际上是一个dart的语法糖
    Person(this.name, this.age, this.height);
    //与上述的等价代码,当然这也是Java中必须要写的代码
    Person(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }    
}

class Student extends Person {//和Java一样同时使用extends关键字表示继承
//在 Dart里:类名(变量,变量,...) 是构造函数的写法, :super()表示该构造调用父类,这里构造时传入三个参数
    Student(String name, int age, double height, double grade): super(name, age, height);
}
Future,await,async

Dart是单线程的,如何处理耗时的操作呢?Dart是基于单线程加事件循环来完成耗时操作的处理。
Future 对象封装了Dart 的异步操作,它有未完成(uncompleted)和已完成(completed)两种状态。

main(List<String> args) {
  print("main function start");
  var future = getNetworkData();
  future.then((value) {
    print(value);
  });
  print("main function end");
}
Future<String> getNetworkData() {
  return Future<String>(() {
    sleep(Duration(seconds: 3));
    return "network data";
  });
}

await,async它们可以让我们用同步的代码格式,去实现异步的调用过程,用来解决回调地狱的。通常一个async的函数会返回一个Future。
await 所在的函数必须添加async关键词。

Future<String> getNetworkData() async {
  var result = await Future.delayed(Duration(seconds: 3), () {
    return "network data";
  });
  return "请求到的数据:" + result;
}
login('name','password').then((token) => fetchUserInfo(token))
  .then((user) => saveUserInfo(user));
// 可以换成
void doLogin() async {
  String token = await login('name','password'); //await 必须在 async 函数体内
  User user = await fetchUserInfo(token);
  await saveUserInfo(user);
}
参考

Dart语法篇之基础语法
Flutter(五)之彻底搞懂Dart异步

相关文章

  • Dart语法简要

    Dart语法和java很接近,本篇就简要列出Dart不同的几点首先看下常见的helloword 数据类型 在dar...

  • dart语法7-泛型

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法8-库

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法10-生成器

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法9-异步

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法11

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法2-内置类型

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法1

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法3-函数

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

  • dart语法4-操作符

    dart语法1dart语法2-内置类型dart语法3-函数dart语法4-操作符dart语法5-异常dart语法6...

网友评论

      本文标题:Dart语法简要

      本文链接:https://www.haomeiwen.com/subject/gaptzctx.html