• Dart 语言学习记录


    变量声明

    1. var Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型

    2. object art所有对象的根基类,也就是说所有类型都是Object的子类(包括Function和Null)

    3. dynamic 声明的变量可以赋值任意对象,dynamicObject相同之处在于,他们声明的变量可以在后期改变赋值类型。

      dynamic声明的对象编译器会提供所有可能的组合, 而Object声明的对象只能使用Object的属性与方法, 否则编译器会报错

    4. finalconst 如果您从未打算更改一个变量,那么使用 finalconst.

      两者区别在于:const 变量是一个编译时常量,final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略

    函数

    1. 函数声明

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

      bool isNoble(int atomicNumber) {
        return _nobleGases(atomicNumber) != null;
      }
      
    2. 对于只包含一个表达式的函数,可以使用简写语法

      bool isNoble (int atomicNumber )=> _nobleGases [ atomicNumber ] != null ;
      
    3. 函数作为变量

      var say = (str){
        print(str);
      };
      say("hi world");
      
    4. 函数作为参数传递

      void execute(var callback) {
          callback();
      }
      execute(() => print("xxx"))
      
    5. 可选的位置参数

      包装一组函数参数,用[]标记为可选的位置参数:

      String say(String from, String msg, [String device]) {
        var result = '$from says $msg';
        if (device != null) {
          result = '$result with a $device';
        }
        return result;
      }
      
    6. 可选的命名参数

      定义函数时,使用{param1, param2, …},用于指定命名参数。例如:

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

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

      enableFlags(bold: true, hidden: false);
      

    异步支持

    Future

    1. 含义:它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。一个Future只会对应一个结果,要么成功,要么失败。

    2. Future.then

    3. Future.catchError

    4. Future.whenComplete

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

    Async/await

    1. 回调地狱(Callback Hell)
    //先分别定义各个异步任务
    Future<String> login(String userName, String pwd){
        ...
        //用户登录
    };
    Future<String> getUserInfo(String id){
        ...
        //获取用户信息 
    };
    Future saveUserInfo(String userInfo){
        ...
        // 保存用户信息 
    };
    
    login("alice","******").then((id){
     //登录成功后通过,id获取用户信息    
     getUserInfo(id).then((userInfo){
        //获取用户信息后保存 
        saveUserInfo(userInfo).then((){
           //保存用户信息,接下来执行其它操作
            ...
        });
      });
    })
    
    1. 使用Future消除Callback Hell

      login("alice","******").then((id){
            return getUserInfo(id);
      }).then((userInfo){
          return saveUserInfo(userInfo);
      }).then((e){
         //执行接下来的操作 
      }).catchError((e){
        //错误处理  
        print(e);
      });
      

      “Future 的所有API的返回值仍然是一个Future对象,所以可以很方便的进行链式调用” ,如果在then中返回的是一个Future的话,该future会执行,执行结束后会触发后面的then回调,这样依次向下,就避免了层层嵌套。

    2. 使用async/await消除callback hell

      task() async {
         try{
          String id = await login("alice","******");
          String userInfo = await getUserInfo(id);
          await saveUserInfo(userInfo);
          //执行接下来的操作   
         } catch(e){
          //错误处理   
          print(e);   
         }  
      }
      
      • async用来表示函数是异步的,定义的函数会返回一个Future对象,可以使用then方法添加回调函数。
      • await 后面是一个Future,表示等待该异步任务完成,异步完成后才会往下走;await必须出现在 async 函数内部.

    steam

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

      ```dart
    

    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
    ```

    转载自 https://book.flutterchina.club/chapter1/dart.html

  • 相关阅读:
    Java语言中:float数据类型在内存中是怎么存储的?
    Java语言中:在数据类型的讲解中补充的几个小问题
    groovy : poi 导出 Excel
    php 基础入门篇之前言
    C 实现strcmp,strcpy,strcat函数
    CSDN 夏令营程序 试题分析 (3)
    HDU 1560 IDA*搜索
    iOS怎样找到自己的沙盒
    51系列小型操作系统精髓 简单实现2
    排序算法总结之折半插入排序
  • 原文地址:https://www.cnblogs.com/7fancier/p/11179089.html
Copyright © 2020-2023  润新知