美文网首页flutter学习
Flutter学习之Dart语言了解

Flutter学习之Dart语言了解

作者: sunny冲哥 | 来源:发表于2019-09-29 10:15 被阅读0次

    前言

    最近准备着手学习一下flutter,首先就要了解它所使用的开发语言 --- Dart


    语言介绍

    Dart所有的东西都是对象,所有的对象都继承自Object类.
    Dart 是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object类的子类,一个类通常由属性和方法组成


    语言类型

    在 Dart 里是强类型的,也有自动推断类型的机制。
    在 Dart 里定义变量使用有 var、const、dynamic、Object、类型等方式。对于函数而言,并不需要写 function 关键字,而让它有函数应有的外形即可。

    // 基本类型
    var name = 'Voyager I';
    var antennaDiameter = 3.7;
    const image = {
        'tags': ['Jupiter', 'Saturn', 'Uranus', 'Neptune'],
        'url': '//path/to/saturn.jpg'
    };
    
    // 函数类型
    String sayHello(var name) {
        return 'Hello $name!';
    }
    
    // 箭头函数
    var add = (a, b) => a + b;
    
    // 类似 Promise
    Future sum(num a, num b) async {
        return await add(a, b);
    }
    
    // main 函数
    void main() async {
        print(sayHello(name));               // Hello Voyager I!
        print(max(1, 2));                    // 2
        sum(1, 2).then((res) => print(res)); // 3 (类似 Promise)
    }
    
    Object name1 = "小明";
    dynamic name2 = "老王";
    

    dynamic 是任意的意思,它与 var 不同,var 会自动推断类型从而得出一个确定类型,而 dynamic 可以表示任意,相对于 Typescript 中的 any。
    Dart 在声明时有以下几个基本类型:number、string、boolean、list、map、rune、symbol

    函数

    Dart 的函数支持函数声明、函数字面量、箭头函数、函数表达式、匿名函数。

    int add(int a, int b) {
        return a + b;
    }
    
    // 类型可省略
    add(a, b) {
        return a + b;
    }
    
    // 箭头函数
    var add = (a, b) => a + b;
    int add(int a, int b) => a + b;
    
    // 可选参数,使用 [] 限定
    int add(int a, int b, [int c = 1, int d = 2]) => a + b + c + d;
    
    // 显示指定参数名称,默认参数
    int add({ int a = 1, int b = 2 }) {
        return a + b;
    }
    add(a: 1, b: 2);
    
    // 回调函数
    var list = ['apples', 'bananas', 'oranges'];
    list.forEach((item) {
        print('${list.indexOf(item)}: $item');
    });
    
    // 回调 + 箭头
    list.forEach((item) => print(item));
    
    // 闭包
    Function makeAdder(int addBy) {
        return (int i) => addBy + i;
    }
    

    操作符

    操作符包括了:expr++、expr--、()、[]、.、?、等,基本和 ES6 一致,除了没有 === 的判断。

    例外有三个特色的操作:is、as、is?。

    is 用于判断类型,as 用于续言、is? 与 is 相反(相等 ,不相等)。

    if (emp is Person) {
        // Type check
        emp.firstName = 'Bob';
    }
    
    (emp as Person).firstName = 'Bob';
    

    级联符号(..):允许您在同一个对象上进行一系列操作。除了函数调用之外,还可以访问同一对象上的字段。这通常会为您节省创建临时变量的步骤,并允许您编写更流畅的代码。

    var gifts = {
        'first': 'partridge',
        'second': 'turtledoves',
        'fifth': 'golden rings'
    };
    
    getGifts() {
        return gifts;
    }
    
    // 不使用级联符号
    var g = getGifts();
    g.first = 1;
    g.second = 2;
    g.fifth = 3;
    // 使用级联符号
    getGifts()
        ..first = 1
        ..second = 2
        ..fifth = 3;
    

    控制流程

    Dart 的控制流程支持:if、if-else、for、while、do-while、switch、try-catch-finally

    if (isRaining()) {
        // ...
    } else if (isSnowing()) {
        // ...
    } else {
        // ...
    }
    
    var message = new StringBuffer('Dart is fun');
    for (var i = 0; i < 5; i++) {
        message.write('!');
    }
    
    var collection = [0, 1, 2];
    for (var x in collection) {
        print(x); // 0 1 2
    }
    

    类结构

    Dart 的类支持继承、静态方法、接口、构造函数、重载操作符、抽象类、接口类、 mixins等。
    Dart 的类不支持什么 public、private ,protected这些访问修饰符,可以使用_把一个属性或者方法定义为私有(注意:需要把这个类抽离成一个文件,才生效)。_method 下划线*代表私有方法。

    模块

    Dart 的模块导入。

    // 全部导入,并且是全局变量
    import 'dart:math';
    max(1, 2);
    
    // 别名
    import 'dart:math' as math;
    math.max(1, 2);
    
    // 只导入部分
    import 'dart:math' show min;
    min(1, 2);
    
    // 懒加载,类似 ES6 的 import()
    import 'dart:math' deferred as math;
    Future greet() async {
        await math.max(1, 2);
    }
    

    异步编程

    在 ES6 与异步相关的就是 Promise、async、await。而在 Dart 则是 Future、async、await。

    Dart库充满了返回 Future 或 Stream 对象的函数。这些功能是异步的:它们在设置可能耗时的操作(例如 I/O)之后返回,而不等待该操作完成。 在 async 和 await 关键字支持异步编程,让你写异步代码看起来类似于同步代码。

    使用 async/await 之前需要引入 dart:async 模块。

    Future<String> lookUpVersion() async => '1.0.0';
    
    Future main() async {
        await for (var request in requestServer) {
            handleRequest(request);
        }
    }
    

    也支持 then,catchError 等。

        final url = 'https://httpbin.org/ip';
        HttpRequest.request(url).then((value) {
            print(json.decode(value.responseText)['origin']);
        }).catchError((error) => print(error));
    }
    
    // 也可以这样写
    Future<String> getIPAddress() async {
        final url = 'https://httpbin.org/ip';
        var request = await HttpRequest.request(url);
        String ip = json.decode(request.responseText)['origin'];
        return ip;
    }
    
    

    类似 setTimeout 的操作。

    await new Future.delayed(const Duration(milliseconds: 2000));
    
    // 或者
    new Future.delayed(const Duration(milliseconds: 2000)).then(() {
        // ...
    });
    

    JSON处理

    json 在 JavaScript 里是一个非常有优势的处理,因为 json 本身延至于 JavaScript。
    在 Dart 里处理 json 有两个 API 可用:encode(序列化) 和 decode(反序列化)。

    // 把对象转为 json 字符串
    var jsonstr = json.encode([1, 2, { "a": null }]);
    
    // 把 json 字符串转为对象
    var decoded = json.decode('["foo", { "bar": 499 }]');
    

    相关文章

      网友评论

        本文标题:Flutter学习之Dart语言了解

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