美文网首页
Flutter (二) 初识Dart(上)

Flutter (二) 初识Dart(上)

作者: 学_iOS | 来源:发表于2021-12-03 18:26 被阅读0次

    感君一回顾,思君朝与暮。

    <一>语法

    1. var、final、const
      • 我们在iOS中定义变量类型会是string,array,dictionary,number,int等。在dart中变量可以用var表示,静态常量const表示,其中变量中final 表示最后一次赋值。
      • 可以放置在变量中的所有内容都是一个对象,每个对象都是类的实例,由于类型判断,大多数变量也不需要声明类型。
      • final修饰的变量可能在之前iOS开发不太一样,只能赋值一次。
    2. num
      • 通常来说有double,int,其中num是可以变化的。
      num a = 10;
      a = 10.1;
      num b = 10.1;
      b = 10;
      
      • int 类型可判断偶数还是奇数isEven/isOdd
      • iOS int 类型 在做除法的时候,如果有有余数会自动舍弃,例如 int a=5/2; a的结果是 2
        Dart 中 int a=5/2; 这种方式是行不通的,直接就报错了, 因为 5/2 的结果是2.5,也就是说int 的除法会出现小数,正确的获取除法方式是 int a=5~/2;
      int intNumber = 5;
      num numNumber = -1.12;
      printString("除法结果是${intNumber/2}");
      printString("除法结果是${intNumber~/2}");
      
      //num 方法
      printString("有穷${numNumber.isFinite}");
      printString("无穷${numNumber.isInfinite}");
      printString("是否是非数字${numNumber.isNaN}");
      printString("是否是负数${numNumber.isNegative}");
      printString(numNumber.toInt()); //转换成int
      printString(numNumber.toDouble()); //转换成Double
      
      //int 方法
      printString("是否偶数${intNumber.isEven}");
      printString("是否奇数${intNumber.isOdd}");
      
      //常用方法
      printString("绝对值${numNumber.abs()}");
      printString("四舍五入${numNumber.round()}");
      printString("向下取整${numNumber.floor()}");
      printString("向上取整${numNumber.ceil()}"); 
      
      • 结果如下
       flutter: 除法结果是2.5
       flutter: 除法结果是2
       flutter: 有穷true
       flutter: 无穷false
       flutter: 是否是非数字false
       flutter: 是否是负数true
       flutter: -1
       flutter: -1.12
       flutter: 是否偶数false
       flutter: 是否奇数true
       flutter: 绝对值1.12
       flutter: 四舍五入-1
       flutter: 向下取整-2
       flutter: 向上取整-1
      

    3.String

    • dart 的string 既可以用"" 也可以用'' ,在字符串拼接过程中如果想要换行的话可以使用 \n 或者''' ''',''' ''', 包含在内的字符串会保留原有的字符串格式,在没有变量的情况下,拼接方式可以使用+号也可以不使用,但是如果有变量,就必须使用+
    • 关于换行:我们可以用\n表示,我们想要表示\n的话字符串前面添加r表示原字符串,字符串里面即使有\n也会显示出来:如String string = r'str\nstr2\n' 则会直接输出str\nstr2\n
    • num.toString() num想要拼接字符串需要转字符串之后再进行拼接
      String sup = 'Ming';
      String adc = 'UZI';
      String top = 'XIAOHU';
      String compose = '''
      $adc
      $sup
      ''';
      printString(compose);
      
      String rng = '${top}' + 'WEI' + 'CRICY' + adc + sup;
      printString(rng);
      
      String rng2 = '${top}'"\n"
      'WEI'"\n"
      'CRICY'"\n"
      '${adc}'"\n"
      '${sup}"\n"';
      
      printString(rng2);
      
      • 结果
      flutter:   UZI
      Ming
      flutter: XIAOHUWEICRICYUZIMing
      flutter: XIAOHU
      WEI
      CRICY
      UZI
      Ming"
      "
      
      • 字符串常用方法
      //字符串常用方法
      //一个空格代表一个字符长度
      String rngTeam = '  XIAOHU,''WEI,''CRYCY,''GALA,''MING  ';
      printString(rngTeam);
      printString(rngTeam.length);//字符串长度
      printString(rngTeam.isEmpty);//是否为空
      printString(rngTeam.isNotEmpty);//是否不为空
      printString(rngTeam.trimLeft());//去除字符串前面的空格
      printString(rngTeam.trimRight());//去除字符串后面的空格
      printString(rngTeam.trim());//去除字符串左右两端的空格
      printString(rngTeam.replaceFirst('GALA', 'UZI'));//只替换字符串里面的第一个出现的GALA
      printString(rngTeam.replaceAll('GALA','UZI'));  //替换数据,把字符串里面所有的GALA替换成UZI
      printString(rngTeam.split(','));//把字符串以','分割成数组
      printString(rngTeam.startsWith("上单?"));   //检测字符串是否以指定的子字符串开始
      printString(rngTeam.endsWith("辅助?"));    //检测字符串是否以/结尾
      printString(rngTeam.toUpperCase());    //所有小写字母转化为大写
      printString(rngTeam.toLowerCase());    //所有大写字母转化为小写
      printString(rngTeam.substring(2,6));   //字符串截取
      printString(rngTeam.indexOf('MING'));  //获取指定字符串位置
      
      • 结果
      flutter:   XIAOHU,WEI,CRYCY,GALA,MING
      flutter: 30
      flutter: false
      flutter: true
      flutter: XIAOHU,WEI,CRYCY,GALA,MING
      flutter:   XIAOHU,WEI,CRYCY,GALA,MING
      flutter: XIAOHU,WEI,CRYCY,GALA,MING
      flutter:   XIAOHU,WEI,CRYCY,UZI,MING
      flutter:   XIAOHU,WEI,CRYCY,UZI,MING
      flutter: [  XIAOHU, WEI, CRYCY, GALA, MING  ]
      flutter: false
      flutter: false
      flutter:   XIAOHU,WEI,CRYCY,GALA,MING
      flutter:   xiaohu,wei,crycy,gala,ming
      flutter: XIAO
      flutter: 24
      

    4.bool

    • Dart 的布尔类型用bool表示,相较于iOS并没有什么不同,在Dart中新增加了一个assert断言这个语法中使用到了bool 这个类型,assert(bool); 如果这个bool类型为真则可以执行到下面的语句,如果bool类型为假,则抛出异常,注意 :这个语句只在debug模式下才会生效,release 模式下不会执行这段代码
      bool success=true,fail=false;
      print(success);
      print(fail);
      print(success||fail); //true   或
      print(success&&fail); //false   与
      
    • 结果
      flutter: true
      flutter: false
      flutter: true
      flutter: false
      

    5.List

    • List相当于iOS中的数组,其中不可变数组我们用const去修饰
      List list=[1,2,3,4,'集合'];   //初始化时添加元素
      printString(list);
      List list2=[];
      list2.add('list2');    //通过add方法添加元素
      list2.addAll(list);    //把list中数据添加到list2中
      printString(list2);
      
    • 结果
      flutter: [1, 2, 3, 4, 集合]
      flutter: [list2, 1, 2, 3, 4, 集合]
      
    • 集合之间的赋值
      List list=[1,2,3,4,'集合'];   //初始化时添加元素
      printString(list);
      List<dynamic> list2=[];
      list2=list;
      printString(list2);
      List list3=List.generate(3, (index) => index*2);
      printString(list3);
      
    • 结果
      flutter: [1, 2, 3, 4, 集合]
      flutter: [1, 2, 3, 4, 集合]
      flutter: [0, 2, 4]
      
    • 数组的三种遍历方法
      for(int i=0;i<list.length;i++){
      print(list[i]);
      }
      for(var o in list){
      print(o);
      }
      list.forEach((val) {
      print(val);
      });
      
    • 数组的常用方法
      List list=[1,2,3,4,'集合'];   //初始化时添加元素
      print(list.remove('集合'));  // 删除第一个匹配的数据
      list.sort();//数组排序 从小到大
      print(list);
      print(list.removeAt(3));  //删除第三个数据
      list.removeRange(2, 3);   //删除下标为2的数据
      print(list);
      print(list.indexOf(3));   //找到第一个满足条件的下标
      list.insert(2, 'json'); //插入数据
      print(list);
      list.insertAll(2, ['bad','good']);   //插入一个数组
      print(list);
      List list1=[1,2,3,4,6];
      list1.retainWhere((value) => value % 2 == 0);
      print(list1);   //删除不满足的条件
      List list20= list1.sublist(2,3);
      print(list20);
      
    • 结果
      flutter: true
      flutter: [1, 2, 3, 4]
      flutter: 4
      flutter: [1, 2]
      flutter: -1
      flutter: [1, 2, json]
      flutter: [1, 2, bad, good, json]
      flutter: [2, 4, 6]
      flutter: [6]
      

    6.Set

    • Set相当于iOS里面的NSSet,差不多,也是值不能重复。
      Set<String> set = {'小明', '小强', '小马', '小张', '小王'};
      print(set);
      /*添加数据*/
      set.add('aa'); //添加一条数据
      set.addAll(['bb', 'cc']); //添加一组数据
      print(set); //{小明, 小强, 小马, 小张, 小王, aa, bb, cc}
      /*获取集合个数*/
      print(set.length); //8
      /*删除数据*/
      set.remove('cc'); //删除指定元素,成功则返回true
      print(set); //{小明, 小强, 小马, 小张, 小王, aa, bb}
      set.removeWhere((element) => element == 'bb'); //删除符合条件的元素
      print(set); //{小明, 小强, 小马, 小张, 小王, aa}
      set.removeAll({'小李', 'aa'}); //删除指定集合中存在的元素
      print(set); //{小明, 小强, 小马, 小张, 小王}
      /*集合非空判断*/
      print(set.isEmpty);//false 空返回true
      print(set.isNotEmpty);//true 非空返回true
      /*获取末尾的元素*/
      print(set.last);//小王
      
    • Set配合List数组去重
      List list100=['小明','小强','小明','小张','小马','小张','小王'];
      print(list100);//[小明, 小强, 小明, 小张, 小马, 小张, 小王]
      Set set100 = {};
      set100.addAll(list100);//将list添加到set中
      print(set100);//{小明, 小强, 小张, 小马, 小王}
      List newList=set100.toList();//将set转换为新list
      print(newList);//[小明, 小强, 小张, 小马, 小王]
      

    7.Map

    • Map相当于iOS里面的字典类型,其中不可变字典我们用const去修饰
      Map names={'xiaoming':'小明','xiaohong':'小红'};
      print(names);
      Map ages={};
      ages['xiaoming']=16;
      ages['xiaohong']=18;
      print(ages);
      
    • 结果
      flutter: {xiaoming: 小明, xiaohong: 小红}
      flutter: {xiaoming: 16, xiaohong: 18}
      
    • 字典的遍历
      ages.forEach((key, value) {
        print('$key,$value');
      });
      for (var key in ages.keys) {
        print('$key ${ages[key]}');
      }
      
    • Map之间的传值
      Map ages2=ages.map((key, value){
        return MapEntry(key, value);
      });
      print(ages2);
      
    • 结果
      flutter: {xiaoming: 16, xiaohong: 18}
      

    8.Map与List的相互转化

    • Map<int, E> asMap();以下标作为key 把数组变为字典
      List list101 = ['1','2','3'];
      Map map101 = list101.asMap();
      printString(map101);
      输出:flutter: {0: 1, 1: 2, 2: 3}
      

    9.运算符

    • ?? 如果左边有值就返回左边的,否则返回右边的
    • ??= 如果没有值则设置一个默认值
      var a = false;
      var b = a ? 2 : 9;
      printString(b);//三目运算
      
      var c;
      printString(c ?? 9);// ?? 如果左边有值就返回左边的,否则返回右边的
      
      c ??= 20;//默认值
      printString(c);
      //输出
      // flutter: 9
      // flutter: 9
      // flutter: 20
      

    <二>dynamic、var、Object三者的区别

    1. dynamic:是所有Dart对象的基础类型, 在大多数情况下,通常不直接使用它,
      通过它定义的变量会关闭类型检查,这意味着 dynamic x = 'hal';x.foo();
      这段代码静态类型检查不会报错,但是运行时会crash,因为x并没有foo()方法,所以建议大家在编程时不要直接使用dynamic;
      var:是一个关键字,意思是“我不关心这里的类型是什么。”,系统会自动推断类型runtimeType;
      Object:是Dart对象的基类,当你定义:Object o=xxx;时这时候系统会认为o是个对象,你可以调用o的toString()和hashCode()方法
      因为Object提供了这些方法,但是如果你尝试调用o.foo()时,静态类型检查会进行报错;
      综上不难看出dynamic与Object的最大的区别是在静态类型检查上;
    • dynamic,object两个和var的区别
      ///dynamic和object:开始x和y都是字符串类型,把他们赋值为int类型不会报错。
      ///因为==dynamic是所有Dart对象的基础类型,Object是Dart对象的基类(父类)。
      dynamic x = 'x';
      printString(x);
      printString(x.runtimeType);
      
      x = 123;
      printString(x);
      printString(x.runtimeType);
      
      Object y = 'y';
      printString(y);
      printString(y.runtimeType);
      
      y = 456;
      printString(y);
      printString(y.runtimeType);
      
      
      ///var:如果开始为字符串类型,赋值为int类型会爆红。因为var第一次赋值会确定它的类型。
      var z = 'hai';
      printString(z);
      printString(z.runtimeType);
      
      /// z = 123;//错误报红
      ///输出:
      // flutter: x
      // flutter: String
      // flutter: 123
      // flutter: int
      // flutter: y
      // flutter: String
      // flutter: 456
      // flutter: int
      // flutter: hai
      // flutter: String
      
    • dynamic,object的区别
      dynamic与Object的最大的区别是在静态类型检查上
      x++; //dynamic类型x++不报错
      printString(x);
      // y++; //Object类型y++报错
      
      //输出 flutter: 124
      
      // dynamic:可以看到x可以进行++操作。因为dynamic不需要类型转换的原因是dynamic跳过编译类型检查
      // Object:进行y++操作的话会爆红。Object没有做类型转换,不能进行直接的计算操作
      // 我们可以Object转int然后再操作
      int intY = int.parse(y.toString());
      intY++;
      printString(intY);
      

    相关文章

      网友评论

          本文标题:Flutter (二) 初识Dart(上)

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