精华内容
下载资源
问答
  • Dart学习笔记之与kotlin、java比较

    千次阅读 2019-03-14 09:44:53
    flutter不管是从开发角度还是程序效率上应该能更好的适用于Android系统上,并且在目前学习Dart时也强烈感受到Dart语言与kotlin语言存在很多的相似之处,出自一家,必有想通吧,因此对flutter的趋势也是很乐观和期待...

    最近Android开发很火的一个UI框架一定是flutter,这也是谷歌推出的移动开发框架,当然适用IOS,想必这也是谷歌在移动应用开发上的一个战略布局,如今移动开发已经很成熟,技术人员也多,门槛也较几年高了,但火热高速发展的同时也带来了互联网泡沫,原生开发带来的技术成本对大部分公司来说还是不可忽视的,各种移动混合开发其实也是在成本方面创新以求降低成本,如果Android和IOS能共用一套代码或者一个人能同时开发两个系统版本,那成本自然也就下降了,如今各种混合开发框架如RN也已经比较成熟还有自己社区,但这些框架都优劣并存,而谷歌最近推出的flutter想必也是应时代需求而推出的,但个人认为,flutter主要是Dart语言开发,Dart语言也是谷歌推出,不管是从UI框架还是语言角度,都是谷歌推出的产品,相对目前的其他混合开发框架,flutter不管是从开发角度还是程序效率上应该能更好的适用于Android系统上,并且在目前学习Dart时也强烈感受到Dart语言与kotlin语言存在很多的相似之处,出自一家,必有想通吧,因此对flutter的趋势也是很乐观和期待的,只是奇怪,flutter为何不用kotlin,不过也不纠结这些深层次的,还是继续抱谷歌大腿吧

     

    工作中,持续更新....

    展开全文
  • 本系列文章以Dart 2.7 为基础,通过与Kotlin或Java的对比来介绍Dart的语法特点和使用方法,主要基于以下两点考虑: Dart有很多与Kotlin或Java相近的语法,与Java尤其相似 很多正在学习Flutter的同学都是Android...

    前言


    Fuchsia已宣布将Dart视作UI开发的主要语言,再加上Flutter的加持,Dart或将扶摇直上成为移动开发领域中最重要的语言,是时候赶紧学习一波了。

    本系列文章以 Dart 2.7 为基础,通过与Kotlin或Java的对比来介绍Dart的语法特点和使用方法,主要基于以下两点考虑:

    • Dart有很多与Kotlin或Java相近的语法,与Java尤其相似
    • 很多正在学习Flutter的同学都是Android开发者,都有Kotlin或Java的使用经验

    除Kotlin和Java以外,Dart的语法中也能看到Javascript、python、C#等语言的影子,写到之处会简单提及但不作为重点比较对象。

    目录


    展开全文
  • 本系列文章通过与Kotlin或Java的对比来介绍Dart的基本语法,主要基于以下两点考虑: Dart有很多与Kotlin或Java相近的语法,与Java尤其相似 很多学习Flutter的同学都是Android开发者,都有Kotlin或Java的使用经验 ...

    在这里插入图片描述

    变量/函数的作用域


    与Kotlin一样,Dart可以在top-level进行变量或函数声明,main函数也在top-level声明,相对于Java作用域变得更广。

    Dart中万物皆对象,所有的函数本质上都是Function类型的实例变量,所以函数可以像变量一样出现在top-level。


    动态类型


    Dart并非脚本语言,所以这里的“动态类型”是指Java的Object或者Kotlin的Any那样的不确定类型,可以在运行时强转成任何具体类型使用。Dart使用Object或者dynamic声明这种不确定类型。

    dynamicObject非常相近,都可以动态进行类型检查、动态赋任何类型的值

    /// 动态判断dynamic对象
    bool convertToBool(dynamic arg) {
      if (arg is bool) return arg;
      if (arg is String) return arg == 'true';
      throw ArgumentError('Cannot convert $arg to a bool.');
    }
    

    他们的区别主要在与静态检查上:

    • dynamic:编译器不会对dynamic象进行静态检查,dynamic对象的任何操作在编译期都是合法的,但是运行时是否会出错需要开发者自己保证,所以建议大家在编程时不要不过度使用dynamic。
    • Object: 是Dart对象的基类,当你定义Object o = xxx ;时 ,编译器会将o作为一个Object对象看待,可以以调用otoString()hashCode()方法,因为Object 提供了这些方法,但是如果你尝试调用o.foo()时,静态类型检查会运行报错。

    Object就是Java的Object,dynamic更像是Javascript的var。有趣的是Dart也有var关键字,但是Dart的var与Js的var不同,一旦赋值之后类型就不能再改变了,所以Dart的var更像是Kotlin的var

    根据 Effective Dart 的建议:

    • 当实例代表“任何类型”时,使用Object
    • 当实例代表“某种待定类型时”时,使用dynamic,可能在某个时间点确定

    访问控制


    通过在函数、变量、类之前添加前导下划线(_)表示其私有性,类似于Java的private关键字,看起来像是借鉴了python的语法。

    需要注意这里的私有不是指package的私有,而是library的私有。library内部即使添加了前导下划线也是可以互相访问的,例如一个Class内的_函数仍然可以被Class外部访问,library内部的访问控制需要使用linter关键字


    类型推导


    Dart像Kotlin一样,可以根据上线文推断出变量类型,而不必事先显式地进行类型声明

    var hoge = "huga";
    [1, 2, 3].forEach((x) => print(x*2));
    

    Dart能够推断出hoge是String,x是int
    主要注意,当指定类型声明时,类型需要像Java前置声明,而不是像Kotlin一样后置。


    变量默认值


    • Dart中万物皆对象,都继承自Object,所以默认值都是null,包括intdouble
    • Java中存在非对象的基本型,所以默认值不是null
    • Kotlin的基本型虽然本质上也是对象,但是其默认值并不是null

    使用assert进行判空

    因为Dart的默认值null的存在,写代码时需要注意判空。Dart的assert()不会影响生产环境中代码的执行,它仅仅在测试环境中起作用,实际开发中可以活用assert进行判空。

    Dart 2.7引入了NNBD (Non null by default),可以像Kotlin一样声明非空类型,将NPE扑灭在编译期。


    NNBD


    从 2.7 开始Dart像Kotlin一样允许声明非空类型

    // int是non-null类型
    final int a = 1;
    
    // non-null类型赋值null会出现error
    final int b = null;
    
    // int?是nullable类型,可以赋值null
    final int? c = null;
    

    我们在命名参数前加required关键字,表示此参数一定能取到值

    // arg1 :non-null的String类型
    void doSomething({required String arg1}) { ... }
    
    // 调用函数时,required的参数不可省略
    doSomething(arg1: "hoge");
    
    

    可以在flutter项目根目录创建一个analysis_options.yaml文件,然后通过添加以下内容,对空安全进行静态检查

    analyzer:
      enable-experiment:     
        - non-nullable
    

    不可变类型与常量


    final

    类似于Java的final或者Kotlin的val,使用final声明的变量是不可变的,不能被二次赋值。

    final hoge = "fuga";
    

    虽然与Java的用法相近,但是细节上更严格:

    • Java的final只规定不能二次赋值,但是没有规定初始化的时机
    • Dart的final要求必须在声明的同时或者在初始化列表中完成初始化。

    Class的final成员可以在初始化列表中初始化:

    mport 'dart:math';
    
    class Point {
      final num x;
      final num y;
      final num distanceFromOrigin;
    
      Point(x, y)
          : x = x, //初始化列表中对final成员初始化
            y = y,
            distanceFromOrigin = sqrt(x * x + y * y);
    }
    
    main() {
      var p = new Point(2, 3);
      print(p.distanceFromOrigin);
    }
    

    const

    • const是编译期必须确定的常量,相当于Kotlin的const val x
    • final是可以在运行时在进行第一次初始化:
    final x = new DateTime.now(); // 正确
    const x = new DateTime.now(); // 错误
    
    final y = sin(90); // 正确
    const y = sin(90); // 错误
    

    另外,const还可以进行字面值的list创建:

    var hoge = const [1, 2, 3];
    

    此时hoge是一个immutable的list,内部的item不能变更



    返回首页:Dart入门教程

    展开全文
  • 类(Class) Java相同,Dart中所有的类都是Object的...Dart1的对象实例化Java一样使用new关键字,Dart2开始可以向Kotlin一样不使用new创建实例 实例通过instance.runtimeType可以获取一个类型对象,相当于Jav...

    在这里插入图片描述

    类(Class)


    与Java相同,Dart中所有的类都是Object的子类。

    与Java和Kotlin一样,this关键字指向当前实例,Dart的代码风格建议省略this,仅在名称冲突等必要的时候使用。

    Dart1的对象实例化与Java一样使用new关键字,Dart2开始可以向Kotlin一样不使用new创建实例

    实例通过instance.runtimeType可以获取一个类型对象,相当于Java的instance.class


    构造函数


    构造函数可以有两种形式

    • ClassName:类名作为构造函数,像Java、Kotlin一样
    • ClassName.identifier : 命名的构造函数,类似工厂方法,可以让构造函数的作用更有针对性
    var p1 = Point(2, 2);
    
    //Named constructor
    var p2 = Point.fromJson({'x': 1, 'y': 2});
    

    当然,这里我们省略了new关键字,Dart1必须像下面这样:

    var p1 = new Point(2, 2);
    var p2 = new Point.fromJson({'x': 1, 'y': 2});
    

    Dart的函数不支持重载,所以当需要定义多个构造函数时,有如下两个选择:

    • 使用可选参数
    • 增加多个命名构造函数

    构造参数为成员赋值


    Kotlin的构造参数添加var/val,可以声明为类的成员变量,并在调用构造函数时直接为其赋值。
    Dart与Kotlin类似,通过添加this.也可以直接为成员赋值,但是成员依然需要单独声明:

    class Person {
      // 成员变量声明
      final String firstName;
      final String lastName;
    
      // 调用时直接为成员变量赋值
      Person(this.firstName, this.lastName) {
        ...
      }
    }
    

    构造函数的继承


    像Java一样,没有声明构造函数的子类只有默认的构造函数(无参的类名构造函数),而不会自动继承父类的任何有参构造函数。所以 想调用父类特定构造函数时,需在子类中显示声明一个构造函数并通过super关键字调用

    class Mutant extends Person {
      Mutant(String firstName, String lastName) : super(firstName, lastName);
    
      Mutant.anonymous() : super.anonymous() {
        print("anonymous mutant");
      }
    }
    

    重定向构造函数


    子类构造函数要么通过super继承自父类的构造函数,要么通过this重定向到另一个自己的构造函数,有点类似于类似与Kotlin的次级构造函数指向主构造函数。

    class Point {
      num x, y;
    
      // The main constructor for this class.
      Point(this.x, this.y);
    
      // Delegates to the main constructor.
      Point.alongXAxis(num x) : this(x, 0);
    }
    

    初始化列表


    构造函数体执行之前,通过初始化列表可以进行成员初始化。 各参数的初始化用逗号分隔。

    // 在构造函数体执行之前,
    // 通过初始列表设置实例变量。
    Point.fromJson(Map<String, num> json)
        : x = json['x'],
          y = json['y'] {
      print('In Point.fromJson(): ($x, $y)');
    }
    

    final成员的初始化可以放到初始化列表进行,但是不能放到构造函数体内

    class Hoge {
      final String fuga;
      Hoge(String moge)
              : assert(moge != null),
              fuga = moge.toUpperCase() {
        print(fuga);
      }
    }
    
    /*
    👇放到函数体内的初始化,编译器会报错
    class Dame {
      final String fuga;
      Hoge(String moge) {
        fuga = moge.toUpperCase();
      }
    }
    */
    

    常量构造函数


    类成员变量全为final、且前置了const关键字的构造函数,我们称为常量构造函数
    常量构造函数实例化的对象成为编译时常量。

    class Point {
        final int x;
        final int y;
    
        const Point(this.x, this.y);
    }
    
    const p = Point(1, 2);
    

    工厂构造函数


    前置factory关键字后称为工厂构造函数
    工厂构造函数与Java的工厂方法类似,需要返回一个类型实例,可以配合缓存实现单例模式。

    class Logger {
      final String name;
      bool mute = false;
    
      // _cache is library-private, thanks to
      // the _ in front of its name.
      static final Map<String, Logger> _cache =
          <String, Logger>{};
    
      factory Logger(String name) {
        if (_cache.containsKey(name)) {
          return _cache[name];
        } else {
          final logger = Logger._internal(name);
          _cache[name] = logger;
          return logger;
        }
      }
    
      Logger._internal(this.name);
    
      void log(String msg) {
        if (!mute) print(msg);
      }
    }
    


    返回首页:Dart入门教程

    展开全文
  • Js的async/awiat是Promise的语法糖一样,Dart的async/awiat只不过是Future的语法糖,可以帮助我们的用同步的代码处理Future提高可读性。脱离async/await,Future本身的API仍然可以完成异步逻辑。 Fu...
  • dart中的 Var 跟kotlin一样,表示任意数据类型 dart中最高级的类跟Java一样叫做Object,Kotlin叫做Any dart中一切都是对象,每个对象都是类的实例(包括null),所有类都继承自object,未被初始化的都会被赋值为:...
  • 成员方法 与Java的成员方法无论在定义...Dart的getter/setter与Kotlin的类似,但是没有backing filed的概念,所有没有filed变量用来存储数据,需要自己声明一个私有变量来充当所谓的backing field class Rect { ...
  • Dart中接口和类是统一的,每个类同时也是一个接口: 没有interface关键字,声明class的同时隐式地创建同名接口 类中的非私有的成员可以通过接口对外暴露,但需要被实现 Java一样,使用implements 关键字实现接口 ...
  • Dart采用Java一样的函数签名写法 String greet(String name) { return "Hello, $name"; } Dart可以通过类型推导确定返回值类型,随意允许在签名中省略返回值类型: greet(String name) { return "Hello, $name...
  • 静态变量、方法的定义使用Java中完全相同,同样使用static关键字,同样不用通过实例调用。 如果是一个广泛使用的静态方法,建议使用top-level方法替代静态方法,我们在Kotlin的编码规范中往往也是这样要求的。 ...
  • Library的导入 import关键字导入Library import 'dart:html';...Dart标准库… dart:xxx 三方库(通过包管理器提供的库,如pub工具)… package:xxx Flutter的Library中也有三方库 import '...
  • 整体上Java的泛型相似,有少许区别 运行时持有类型信息 Java的泛型的类型信息在运行时会丢弃,Dart则一直保持到运行时,可以动态check泛型信息 final strList = <String>[ "hoge", "fuga", "moge" ]; ...
  • Dart的注释用法Java大体相同。 单行注释 final hoge = 0; // 到行末都是注释内容 多行注释 Java一样/**/ void main() { /* * This is a lot of work. Consider raising chickens. Llama larry = Llama()...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 131
精华内容 52
关键字:

dart与kotlin