• 【持续更新中】Dart语言核心知识梳理


    一、基本数据类型

    1、Number

    Dart数字有两种类型

    1.1、int

    不超过64位的整数,具体取决于平台。编译为JavaScript的Dart范围小。

    int a=5;
    
    • 1

    1.2、double

    64位(双精度)浮点型数字。由IEEE 754标准规定

    double a = 5;
    double b = 5.0;
    
    • 1
    • 2

    2、String

    String有较多的api,可以参考【Dart字符串处理】

    3、bool

    bool exist = true;
    
    • 1

    4、List

    Dart中的数组,有序集合。

    // List赋值
    var fruits = ['apples', 'oranges'];
    var list = <int>[1, 2, 3]; //[1, 2, 3]
    var list1 = const <int>[1, 2, 3]; //const修复的List不可修改
    var list2 = List.filled(3, 0); //[0, 0, 0]
    var list3 = List.generate(3, (i) => i); //[0, 1, 2]
    
    // 添加元素
    fruits.add('kiwis');
    
    // 添加多个元素
    fruits.addAll(['grapes', 'bananas']);
    
    // 获取第一个元素
    fruits.first;
    
    // 获取元素最后一个元素
    fruits.last;
    
    // 查找某个元素的索引号
    assert(fruits.indexOf('apples') == 0);
    
    // 删除指定位置的元素,返回删除的元素
    fruits.removeAt(index);
    
    // 删除指定元素,成功返回true,失败返回false
    fruits.remove('apples');
    
    // 删除最后一个元素,返回删除的元素
    fruits.removeLast();
    
    // 删除指定范围元素,含头不含尾,成功返回null
    fruits.removeRange(start,end);
    
    // 删除指定条件的元素,成功返回null
    fruits.removeWhere((item) => item.length >6);
    
    // 删除所有的元素
    fruits.clear();
    
    // sort()对元素进行排序,传入一个函数作为参数,return <0表示由小到大, >0表示由大到小
    fruits.sort((a, b) => a.compareTo(b));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    5、Set

    Dart中的无序集合是Set

    //Dart中的无序集合是Set
    var set1 = {'a', 'b', 'c'};
    // 指定类型
    var set2 = <String>{};
    // This works, too.
    Set<String> set3 = {};
    // var names = {}; // 注意:这种是map不是Set
    
    set2.add('1');
    set2.addAll(set1);//{1, a, b, c}
    set2.length;//4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    6、Map

    键值对。key和value都可以是任意类型的对象,key只能出现一次,value可以出现多次。

    // Map的声明一
    var map1 = {
      'oahu': ['waikiki', 'kailua', 'waimanalo'],
      'big island': ['wailea bay', 'pololu beach'],
      'kauai': ['hanalei', 'poipu']
    };
    // Map的声明二
    var map2 = new Map();
    /**
     * Map的声明三
     * 指定键值对的参数类型
     */
    var map3 = new Map<int, String>();
    
    // Map的赋值.中括号中是Key,这里可不是数组
    map3[54] = 'dart';
    //Map中的键值对是唯一的
    //同Set不同,第二次输入的Key如果存在,Value会覆盖之前的数据
    map3[54] = 'xenon';
    
    // 检索Map是否含有某Key
    map3.containsKey(54);
    //删除某个键值对
    map3.remove(54);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    7、【印象】Runes

    【表情符号】在Dart中,Runes是字符串的UTF-32代码点。

    main() {
      var clapping = '\u{1f44f}';
      print(clapping);
      print(clapping.codeUnits);
      print(clapping.runes.toList());
    
      Runes input = new Runes(
          '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
      print(new String.fromCharCodes(input));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    8、【印象】Symbol

    Symbol对象表示Dart程序中声明的运算符或标识符。

    9、Function

    Dart是真面向对象的语言,所以即使是函数也是一个对象,类型为Function。这意味着函数可以分配给变量或者作为参数传递给其他函数。

    9.1、可选参数

    void test() {}
    
    • 1

    二、类型转换

    1、String -> int

    var one = int.parse('1');
    
    • 1

    2、String -> double

    var onePointOne = double.parse('1.1');
    
    • 1

    3、int -> String

    String oneAsString = 1.toString();
    
    • 1

    4、double -> String

    注意括号中要有小数点位数,否则报错

    String piAsString = 3.14159.toStringAsFixed(2);
    
    • 1

    三、Dart运算符

    1、 ?. 空检查运算符

    它的意思是左边如果为空返回 null,否则返回右边的值。

    A?.B
    如果 A 等于 null,那么 A?.B 为 null
    如果 A 不等于 null,那么 A?.B 等价于 A.B

    void main() {
      User? userA;
      User? userB = User();
      print(userA?.name);//null
      print(userB.name);//name字段
    }
    
    class User {
      String _name = 'name字段';
      get name => _name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、 ?? 空检查运算符

    空检查运算符。它的意思是左边如果为空返回右边的值,否则不处理。

    A??B
    如果 A 等于 null,那么 A??B 为 B
    如果 A 不等于 null,那么 A??B 为 A

    void main() {
      User? userA;
      User? userB = User();
      print((userA ?? userB).name);//name字段
      print((userB).name);//name字段
    }
    
    class User {
      String _name = 'name字段';
      get name => _name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3、??= 赋值空检查运算符

    ??= 简单的说就是如果左侧为空,则执行赋值。并且当变量为空时,只会分配一个值。

    void main() {
      String? name;
      name ??= '张三';
      name ??= '李四';
      name ??= '王五';
      print('name' + name.toString());//name张三
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4、=> 箭头运算符

    =>Dart 中称为粗箭头运算符。它有两种应用场景。一是 相当于 {return x;} 的作用,二是作用于单条语句

    // 1\. 相当于 `{return x;}` 的作用
    String testFunction1(String text) => text.toLowerCase();
    // 2\. 作用于单条语句
    void testFunction2(String text) => print(text);
    
    • 1
    • 2
    • 3
    • 4

    5、… 级联运算符

    级联运算符更改对象属性(通常是在创建对象时)的一种简单方法,而不是获得对该对象的引用并逐个更改属性。

    void main() {
      User user = User()
        ..name = '张三'
        ..age = 15;
      print(user.toString());//张三15岁
    }
    
    class User {
      String name = '';
      int age = 0;
    
      @override
      String toString() {
        return name + age.toString() + '岁';
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    6、~/ 求商算术运算符

    算术运算符,〜/运算符除以并返回结果的底数(整数部分)。

    void main() {
      int a = 7;
      int b = 3;
      print(a ~/ b);//2
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    7、… 拓展运算符

    使用此运算符可以轻松解压缩列表

    void main() {
      List aList = [1, 2];
      var bList = ['a', 'b'];
      print([...aList, 'asdf', ...bList]);//[1, 2, asdf, a, b]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    8、is 运算符

    a is b,用于判断 a 对象是否是 b 类的实例,返回 bool 值

    void main() {
      User a = User();
      SuperUser b = SuperUser();
      User c = SuperUser();
      print(a is User); //true
      print(b is SuperUser); //true
      print(c is SuperUser); //true
    }
    class User {}
    class SuperUser extends User {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    9、is!运算符

    意义与上面相反

    10、as 运算符

    类型转换

    void main() {
      User a = User();
    
      a.userName;
      (a as SuperUser).superUserName;
    }
    
    class User {
      get userName => 'userName';
    }
    
    class SuperUser extends User {
      get superUserName => 'superUserName';
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    11、! 断言运算符

    声明变量非null

    void printText(String? str) {
      print('' + str!);
    }
    
    • 1
    • 2
    • 3

    四、字符串处理

    这里主要记录dart与常规的高级语言不通之处,相同之处startsWith、endsWith、contains、replaceAll、indexOf、lastIndexOf等不做记录

    1、多行字符串

    使用三个单引号或三个双引号 创建多行字符串,保留内在格式,如换行和缩进等,里面写什么输出就是什么。

    String text = '''asd
       fdsd
         fff
      
      ''';
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、使用r创建原始raw字符串

    转义字符等特殊字符会输出出来,而不会自动被转义

    String str1 = r'Hello \n  World';
    
    • 1

    3、字符串模板

    使用${} 将一个字符串变量/表达式嵌入到另一个字符串内

    void main() {
      String name = '张三';
      String text = '名字${name.toLowerCase()}';
      print(text); //名字张三
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4、【印象】splitMapJoin方法

    查询“,”,用onMatch的返回值替换“,”用onNonMatch的返回值替换其他

    void main() {
      String a8 = "a b,c";
      String a7 = a8.splitMapJoin(",", 
          onMatch: (Match match) {
        return "1";
      }, onNonMatch: (String nonMatch) {
        return "2";
      });
      print(a7); //212    a b,c  =>   212
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5、replaceFirst方法

    替换第一个

    String a4 = "abcdeab";
    print(a4.replaceFirst("ab", "dd"));//ddcdeab 只替换第一个符合条件的
    
    • 1
    • 2

    6、replaceRange方法

    指定范围替换

    String a4 = "abcdeab";
    // 范围替换 从0-3 含0不含3
    print(a4.replaceRange(1, 3, "1"));//a1deab
    
    • 1
    • 2
    • 3

    7、【印象】replaceAllMapped方法

    【有印象即可】用方法返回值替换指定的字符串

    String a4 = "abcdeab";
    print(a4.replaceAllMapped("c", (Match match){//abyydeab 用方法返回值替换指定的字符串
      return "yy";
    }));
    
    • 1
    • 2
    • 3
    • 4

    其中match参数如下图所示

    image-20211222155858546

    8、【印象】replaceFirstMapped方法

    从index=2开始 用方法返回值替换指定的字符串

    String a4 = "abcdeab";
    print(a4.replaceFirstMapped("b", (Match match){//abcdea333 从index=2开始 用方法返回值替换指定的字符串
      return "333";
    },2));
    
    • 1
    • 2
    • 3
    • 4

    9、indexOf方法

    indexOf支持从index=xx开始往后找

    lastIndexOf支持从index=xx开始往前找

    String a9 = "aababcc1bc23";
    print(a9.indexOf("ab",2));//3 从index=2开始往后找
    
    • 1
    • 2

    10、trim方法

    a11.trim()//去除左右两边空格
    a11.trimRight()//去除右边空格
    a11.trimLeft()//去除左边空格
    
    • 1
    • 2
    • 3

    11、【印象】padLeft、padRight方法

    补齐长度 剩余位使用指定字符串替换

    String a13 = "111";
    print(a13.padLeft(6));// 111 剩余3个位 默认使用""补齐
    print(a13.padRight(6,"c")); //111ccc 剩余3个位 指定使用"c"
    print(a13.padRight(6,"dd")); //111dddddd 剩余3个位 每个位指定使用"dd" 替换后总长度不是6
    print(a13.padLeft(2,"e"));//111 如果指定长度小于原字符串长度 返回原字符串
    
    • 1
    • 2
    • 3
    • 4
    • 5

    12、compareTo方法

    String a12 = "bbcc";
    print(a12.compareTo("aaa"));//1 在ascii码中 b>a
    
    • 1
    • 2

    13、【印象】codeUnits方法

    返回给定字符串的UTF-16代码单元列表

    String str = "Hello";
    print(str.codeUnits);//[72, 101, 108, 108, 111]
    
    • 1
    • 2

    14、【印象】codeUnitAt方法

    返回给定索引处的16位UTF-16代码单元

    String str = "Hello";
    print(str.codeUnitAt(0));//72
    
    • 1
    • 2

    15、==运算符

    比较两个字符串是否相同。这里没有equals

    16、[]取值运算符

    取出字符串索引位指向的单个字符

    String a = 'abc';
    print(a[1]); //b
    
    • 1
    • 2

    17、StringBuffer字符串变量

    StringBuffer是可改变的,定义后还可以再修改

    StringBuffer buffer = new StringBuffer();
    buffer.write("a ");
    buffer.write("b ");
    print(buffer);
    buffer.clear();
    buffer.write("c ");
    print(buffer);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    基本数据类型在内存中存储形式
    java毕业设计——基于Java+Javamail的邮件收发系统设计与实现(毕业论文+程序源码)——邮件收发系统
    2022年密码测评理论与关键技术前沿论坛|海泰方圆分享密码应用改造典型方案
    价值1000元的稀有二开版的无限坐席在线客服系统源码+教程
    C++函数知识点(增强版)
    基于vue的实时交流聊天系统软件设计
    i7 1255u和i5 1135G7哪个好
    [庆国庆 迎国庆 发文]云计算的概念
    介绍argparse的使用【Python标准库】
    探索C语言的内存魔法:动态内存管理解析
  • 原文地址:https://blog.csdn.net/liuxingyuzaixian/article/details/125636130