dart

介绍

Dart 是面向对象的编程语言,语法风格对于许多现有的开发人员来说都很熟悉,但对于前端来说,面向对象反而是不熟悉的,因为JavaScriptclass在es6才出现,浏览器的兼容差导致前端开发在开始熟悉js的时候往往会避开class这类知识。随着前端webpack等打包程序、三大前端框架的出现,越来越多的前端er开始使用es6的知识来编写代码????扯远了扯远了。Dart的很多语法与ts可以说是十分相似(编程语言大差不差?),这对前端er学习dart提供了极大的便利,下面的内容部分会将Dartjs进行比较。

目标

学习dart的目的是学习flutter,小目标,年前写一个小型flutter项目。

基础知识

重要的概念

  • 任何保存在变量中的都是一个 对象 , 并且所有的对象都是对应一个 类 的实例。 无论是数字,函数和 null 都是对象。所有对象继承自 Object 类。
  • 尽管 Dart 是强类型的,但是 Dart 可以推断类型,所以类型注释是可选的。 在上面的代码中, number 被推断为 int 类型。 如果要明确说明不需要任何类型, 需要使用特殊类型 dynamic 。
  • Dart 支持泛型,如 List (整数列表)或 List (任何类型的对象列表)。
  • Dart 支持顶级函数(例如 main() ), 同样函数绑定在类或对象上(分别是 静态函数 和 实例函数 )。 以及支持函数内创建函数 ( 嵌套 或 局部函数 ) 。
  • 类似地, Dart 支持顶级 变量 , 同样变量绑定在类或对象上(静态变量和实例变量)。 实例变量有时称为字段或属性。
  • 与 Java 不同,Dart 没有关键字 “public” , “protected” 和 “private” 。 如果标识符以下划线(_)开头,则它相对于库是私有的。 有关更多信息,参考 库和可见性。
  • 标识符 以字母或下划线(_)开头,后跟任意字母和数字组合。
  • Dart 语法中包含 表达式( expressions )(有运行时值)和 语句( statements )(没有运行时值)。 例如,条件表达式 condition ? expr1 : expr2 的值可能是 expr1 或 expr2 。 将其与 if-else 语句 相比较,if-else 语句没有值。 一条语句通常包含一个或多个表达式,相反表达式不能直接包含语句。
  • Dart 工具提示两种类型问题:警告_和_错误。 警告只是表明代码可能无法正常工作,但不会阻止程序的执行。 错误可能是编译时错误或者运行时错误。 编译时错误会阻止代码的执行; 运行时错误会导致代码在执行过程中引发 [异常](#exception)。

变量

  1. 显式类型声明String name = 'Bob';,直接将变量类型写出来。

  2. 动态类型声明var name = 'Bob';,根据变量的赋值推断变量类型。

  3. 未初始化的变量默认值为null

  4. finalconst自我感觉区别在于,const定义的变量,在等于号的右边必须是个值,而不能是一个函数返回值,而final定义的变量,在等于号的右边可以是任意值。 相同点变量是值在初始化后不能改变。

  5. 变量类型

    • 任意类型
      dynamic any = 'Bob';
    • 数字类型
      不大于64位整数int int1 = 1;
      64位双精度浮点数double double1 = 1.3;
      字符串转换为数字的方法:var one = int.parse('1');double.parse('1.1');
      数字转换为字符串的方法:String oneAsString = 1.toString();String piAsString = 3.14159.toStringAsFixed(2);
    • 字符串类型
      String str = 'str';
      拼接字符串的方法:
       String str0 =  '123'+'456'+'789'
       String str1 = '123'
       String str2 = '789 ${str1} 456'
       String str3 = '123''456''789'
       String str4 = '''123
                     456
                     789'''
      
    • 布尔类型
      bool bool1 = true;
      Dart 的类型安全意味着不能使用 if (nonbooleanValue) 或者 assert (nonbooleanValue)。 而是应该像下面这样,明确的进行值检查: ```dart // 检查空字符串。 var fullName = ‘’; assert(fullName.isEmpty);

    // 检查 0 值。 var hitPoints = 0; assert(hitPoints <= 0);

    // 检查 null 值。 var unicorn; assert(unicorn == null);

    // 检查 NaN 。 var iMeantToDoThis = 0 / 0; assert(iMeantToDoThis.isNaN);

           * 列表类型  
    `List<dynamic> list1 = [0,'1','2.0'];`,类似`JavaScript`的`Array`。
           * Set类型  
    `Set<String> set1 = {'1','2','3'};`  
    `var set2 = <String>{};`  
    Set类型保证内部元素唯一,且内部元素无序。
    Set类型对象添加元素
     ```dart
     var elements = <String>{};
     elements.add('fluorine');
     elements.addAll(halogens);
    
       * Map类型   `Map<String,String> map1 = {'1':'1','2':'2','3':'3'};`   `var map2 = <String,String>{'1':'1','2':'2','3':'3'};`     Map 是用来关联 keys 和 values 的对象。 keys 和 values 可以是任何类型的对象。   与`JavaScript`map对象类似。
       * Rune   Rune 用来表示字符串中的 UTF-32 编码字符。
       * 函数  ```dart  bool isNoble(int atomicNumber) {  return _nobleGases[atomicNumber] != null;  }  ```    数中只有一句表达式,可以使用简写语法:    ```dart  bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;  ```    可选参数:类似`JavaScript`,向函数传对象,在函数表达式上用解构赋值,没传就是null    位置可选参数:将参数放到 [] 中来标记参数是可选的:  ```dart  String say(String from, String msg, [String device]) {
     ...  }  ```  默认参数值: 定义方法的时候,可以使用 = 来定义可选参数的默认值。 默认值只能是编译时常量。 如果没有提供默认值,则默认值为 null。    ```dart  /// 设置 [bold] 和 [hidden] 标志 ...  void enableFlags({bool bold = false, bool hidden = false}) {...}  ```    
    

知识点

编码风格