美文网首页
Flutter之Dart

Flutter之Dart

作者: Ray_lawq | 来源:发表于2019-08-01 17:47 被阅读0次

    变量

    普通:

    bool b ;
    b = true;
    string a = '';
    

    var

    //这样命名和普通命名一样
    var string a;
    a = '';
    // var 也可以不声明类型(可以接收任何类型的变量),一旦赋值不能修改。
    var t;
    t = "hi world";
    // 下面代码在dart中会报错,因为变量t的类型已经确定为String,
    // 类型一旦确定后则不能再更改其类型。
    t = 1000;
    

    final 和 const

    //用final 和 const 声明变量,变量不能修改
    //const 变量是一个编译时常量,final变量在第一次使用时被初始化
    //可以省略String这个类型声明
    final str = "hi world";
    //final String str = "hi world"; 
    const str1 = "hi world";
    //const String str1 = "hi world";
    

    dynamic和Object

    //Object 是Dart所有对象的根基类,所以任何类型的数据都可以赋值给Object声明的对象. 
    //dynamic与var一样都是关键词,声明的变量可以赋值任意对象。 而dynamic与Object相同之处在于,他们声明的变量可以在后期改变赋值类型。
     dynamic t;
     Object x;
     t = "hi world";
     x = 'Hello Object';
     t = 1000;
     x = 1000;
    
     //变量a不会报错, 变量b编译器会报错
     dynamic a = '';
     Object b = '';
     print(a.length);
     // warning:
     // The getter 'length' is not defined for the class 'Object'
     print(b.length);
    //[注]dynamic的这个特性与Objective-C中的id作用很像. dynamic的这个特点使得我们在使用它时需要格外注意,这很容易引入一个运行时错误.
    

    函数

    //一般写法
    int add:(int a , ini b){
      return a+b;
    }
    
    //如果函数里边只有一句可以简写如下:( "=>" 写法)
    int add:(int a , ini b) => return a+b;
    
    //函数作为变量
    var say = (str){
      print(str);
    };
    say("hi world");
    
    //函数可以作为变量,实现回调(oc 的block)
    void textCallBack(var callBack){
        int a = 10;
        callBack(a);
    }
    void showCallBack(){
      textCallBack((int a){
        print(a);
      });
    }
    //可以简写为:
     void showCallBack() => textCallBack((int a) => print(a));
    
    //可以选固定参数(常用)
    void textP(int a, {int b,int c}){
       print('$a' + b + '$c' + d);
    }
    void showtextP(){
      textP(10);//yes
      textP(10,c: 10,);//yes
    }
    //在Widget 里边是这样命名可选,实现构造函数
    class StateMsg extends StatefulWidget {
      final a;
      const StateMsg({Key key, this.a}) : super(key: key);
    }
    
    //可选位置参数
    //使用[] ,标记里边的参数是可选的,String d = 'ni hao' 给参数加上默认值
    void textp (int a,[String b, String d = 'ni hao', bool c]){
      print('$a' + '$b' + '$c');
    }
    //调用用时可选参数必须依次赋值,如果想指定某个位置上的参数值,则必须前面位置的已经有值,(有默认值也不行)
    void showtextP(){
      textp(10);//yes
      textp(10,true);//error
      textp(10,'b',true);//error
      textp(10,'b','d',true);//yes
    }
    

    异步

    async 和 wait

    // async 修饰 request 方法,表示当前方法为异步方法
    // await 修饰请求,表示当前任务为耗时炒作,需要等待响应
    // async 和 wait 是配套使用的 
    void request async (){
      final response = await http.get('https://xxx');
    }
    

    Future:表示一个异步操作的最终完成(或失败)及其结果值的表示。

    //拓展一下上边的例子
     Future<List<>> _getDatas() async {
        final response = await http.get('https://xxx');
        if (response.statusCode == 200) {
          return [];
        } else {  
          throw Exception('statusCode:${response.statusCode}');
        }
     }
    // Future.then 处理成功成功
    // Future.catchError 处理失败
    // Future.whenComplete 表示网络处理完成(失败和成功都会执行,可以处理一些特定的逻辑)
    _getDatas().then((datas) {
      print(成功);          
    }).catchError((error) {
      print(error);
    }).whenComplete((){
      print(完成);
    });
    

    回调地狱(Callback Hell):异步任务依赖;比如登录->获取用户信息->保存用户信息(oc 可以使用group,栅栏函数,信号,等等的方法,来预防block里嵌套方法)

    //先分别定义各个异步任务
    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((){
           //保存用户信息,接下来执行其它操作
        });
      });
    });
    // 这就是回调地狱,这种代码可读性低,出错率较高,并且非常难维护;可以使用Future.then 来完美的处理
    // 因为方法的返回都是Future 对象,所以可以很方便的进行链式调用,这样依次向下,就避免了层层嵌套。
    login("alice","******").then((id){
      return getUserInfo(id);
    }).then((userInfo){
      return saveUserInfo(userInfo);
    }).then((data){
       //成功
    }).catchError((e){
      //错误处理  
    });
    
    //也可以使用 async 和 wait 来避免
    task() async {
       try{
        String id = await login("alice","******");
        String userInfo = await getUserInfo(id);
        await saveUserInfo(userInfo);
        //执行接下来的操作   
       } catch(e){
        //错误处理   
        print(e);   
       }  
    }
    

    Stream 接收多个异步操作的结果(Future 只能接收一个,用法相似,不用过多表述)
    常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等

    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
    

    相关文章

      网友评论

          本文标题:Flutter之Dart

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