Flutter中dart语言简介

变量声明

变量描述例子
var可以接受任何类型,但是变量一旦赋值,将无法改变其类型var i=7

dynamic

可以接受任何类型,变量赋值后还能够改变类型,dynamic声明的对象编译器会提供所有可能的组合

dynamic a;
    Object b;
    main() {
        a = "";
        b = "";
        printLengths();
    }   
   
    printLengths() {
        // no warning
        print(a.length);
        // warning:
        // The getter 'length' is not defined for the class 'Object'
        print(b.length);
    }

Object可以接受任何类型,变量赋值后还能够改变类型,Object声明的对象只能使用 Object 的属性与方法, 否则编译器会报错
finalfinal 变量只能被设置一次,被final修饰的变量,变量类型可以省略,final变量在第一次使用时被初始化

//可以省略String这个类型声明

final str = "hi world";

constconst变量只能被设置一次,被const修饰的变量,变量类型可以省略,const 变量是一个编译时常量const str1 = "hi world";

函数

函数声明

bool isNoble(int atomicNumber) {
     return _nobleGases[atomicNumber] != null;
   }

Dart 函数声明如果没有显式声明返回值类型时会默认当做dynamic处理,注意,函数返回值没有类型推断:

   typedef bool CALLBACK();
   
   //不指定返回类型,此时默认为dynamic,不是bool
   isNoble(int atomicNumber) {
     return _nobleGases[atomicNumber] != null;
   }
   
   void test(CALLBACK cb){
      print(cb()); 
   }
   //报错,isNoble不是bool类型
   test(isNoble);

函数入参

不能同时使用可选的位置参数和可选的命名参数

可选的位置参数

包装一组函数参数,用[]标记为可选的位置参数,并放在参数列表的最后面

String say(String from, String msg, [String device]) {
     var result = '$from says $msg';
     if (device != null) {
       result = '$result with a $device';
     }
     return result;
   }
//不带可选参数调用这个函数的例子
say('Bob', 'Howdy'); //结果是: Bob says Howdy
//带可选参数
say('Bob', 'Howdy', 'smoke signal'); //结果是:Bob says Howdy with a smoke signal
可选的命名参数

定义函数时,使用{param1, param2, …},放在参数列表的最后面,用于指定命名参数。例如:

   //设置[bold]和[hidden]标志
   void enableFlags({bool bold, bool hidden}) {
       // ... 
   }

调用函数时,可以使用指定命名参数。例如:paramName: value

enableFlags(bold: true, hidden: false);

异步操作

Future与 JavaScript 中的Promise非常相似,表示一个异步操作的最终完成(或失败)及其结果值的表示。Future相当于Promise

API描述例子备注
Future.then
异步成功进入的函数

Future.delayed(new Duration(seconds: 2),(){
   return "hi world!";
}).then((data){
   print(data);
});

Future.catchError

异步失败进入的函数

并不是只有 catchError回调才能捕获错误,then方法还有一个可选参数onError,我们也可以它来捕获异常:

Future.delayed(new Duration(seconds: 2),(){
   //return "hi world!";
   throw AssertionError("Error");  
}).then((data){
   //执行成功会走到这里  
   print("success");
}).catchError((e){
   //执行失败会走到这里  
   print(e);
});

Future.delayed(new Duration(seconds: 2), () {
    //return "hi world!";
    throw AssertionError("Error");
}).then((data) {
    print("success");
}, onError: (e) {
    print(e);
});

Future.whenComplete
不论成功与否都会进入这个函数(可以用来关机加载框)

Future.delayed(new Duration(seconds: 2),(){
   //return "hi world!";
   throw AssertionError("Error");
}).then((data){
   //执行成功会走到这里 
   print(data);
}).catchError((e){
   //执行失败会走到这里   
   print(e);
}).whenComplete((){
   //无论成功或失败都会走到这里
});

Future.wait
接受一个Future数组参数,只有数组中所有Future都执行成功后,才会触发then的成功回调,只要有一个Future执行失败,就会触发错误回调

Future.wait([
  // 2秒后返回结果  
  Future.delayed(new Duration(seconds: 2), () {
    return "hello";
  }),
  // 4秒后返回结果  
  Future.delayed(new Duration(seconds: 4), () {
    return " world";
  })
]).then((results){
  print(results[0]+results[1]);
}).catchError((e){
  print(e);
});
//执行上面代码,4秒后你会在控制台中看到“hello world”。

Async/await

Dart 中的async/await 和JavaScript中的async/await功能和用法是一模一样的

Stream

Stream 也是用于接收异步事件数据,和Future 不同的是,它可以接收多个异步操作的结果(成功或失败)。 也就是说,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。举个例子

Stream.fromFutures([
  // 1秒后返回结果
  Future.delayed(new Duration(seconds: 1), () {
    return "hello 1";
  }),
  // 抛出一个异常
  Future.delayed(new Duration(seconds: 2),(){
    throw AssertionError("Error");
  }),
  // 3秒后返回结果
  Future.delayed(new Duration(seconds: 3), () {
    return "hello 3";
  })
]).listen((data){
   print(data);
}, onError: (e){
   print(e.message);
},onDone: (){
});


// 结果如下
I/flutter (17666): hello 1
I/flutter (17666): Error
I/flutter (17666): hello 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值