美文网首页
Flutter之Dart基础语法(一)

Flutter之Dart基础语法(一)

作者: Bfmall | 来源:发表于2023-08-14 11:04 被阅读0次

    一.Hello Dart

    1.1. 打印 print
      print('hello dart');
      // command + s 清理运行缓存
    
    1.2. Dart程序分析

    1.Dart语言的入口也是main函数,并且必须显示的进行定义;
    2.Dart的入口函数main是没有返回值的;
    3.传递给main的命令行参数,是通过List完成的。
    从字面值就可以理解List是Dart中的集合类型。
    其中的每一个String都表示传递给main的一个参数;
    4.定义字符串的时候,可以使用单引号或双引号;
    5.每行语句必须使用分号结尾,很多语言并不需要分号,比如Swift、JavaScript;
    二.定义变量

    2.1. 定义变量(Explicit)

    /**
    声明变量
    变量类型 变量名称 = 赋值;
    */

      String name = 'xiao ming';
      int age = 18;
      double height = 1.88;
      print('$name, $age, $height');  
    
    2.2. 类型推导(Type Inference)
    /**
        var/dynamic/const/final 变量名称 = 赋值;
        const/final 初始化必须赋值
      */
    

    1.var

      var name = 'name';
      name = 'yh';
      print(name.runtimeType);//String
    

    2.dynamic 动态类型

      // dynamic可以改变变量类型,通常情况下不使用dynamic, 因为类型的变化会带来潜在的危险
      dynamic age = '180';
      print(age.runtimeType);//String
      age = 180;
      print(age.runtimeType);//int
    

    3.final & const
    final和const都是用于定义常量的,也就是定义之后不可以修改

    final name = 'yh';
    // name = 'hy';//错误
    
    const age = 18;
    // age = 81;//错误
    

    final和const区别
    const在赋值时,赋值的内容必须是在编译期间就确定下来的
    final在赋值时,可以动态获取,比如赋值一个函数;final一旦被赋值后就有确定的结果,不会再次赋值

    void main(List<String> args) {
      const name = getName();//错误的做法,因为要执行函数才能获取到值
      final name2 = getName();
    }
    
    String getName() {
      return 'yh';
    }
    

    const修饰赋值语句,只会使用同一份内存,可提高性能:

    void main(List<String> args) {
      final a = const Person();
      final b = const Person();
      print(identical(a, b));//true
    
      final c = Person();
      final d = Person();
      print(identical(c, d));//false
    }
    
    class Person {
      const Person();
    }
    

    三.数据类型

    3.1. Int Double
      //1.整数类型int
      int age = 12;
      int hexAge = 0x12;
      print('$age,$hexAge');//12,18
      //2.浮点型double
      double height = 1.88;
    
      //字符串与数字转换
      //1.字符串转数字
      var one = int.parse('111');
      print('$one ${one.runtimeType}');//111 int
    
      //2.数字转字符串
      var num1 = 123;
      var num2 = 123.456;
      var num1Str = num1.toString();
      var num2Str = num2.toString();
      var num2StrD = num2.toStringAsFixed(1);
      print('$num1Str,$num2Str,$num2StrD');//123,123.456,123.5
    
    3.2. bool

    注意:Dart中不能判断非0即真,或者非空即真

    var isFlag = true;
    print('$isFlag,${isFlag.runtimeType}');//true,bool
    
    var message = 'dart';
    //错误写法
    if (message) {
        print(message);
    }
    
    3.3. String

    Dart字符串是UTF-16编码单元的序列。您可以使用单引号或双引号创建一个字符串:

    //单行字符串
    var str1 = 'str1';
    var str2 = "str2";
    //多行字符串
    var str3 = '''
    1
    2
    3
    ''';
    //字符串拼接
    var str4 = '$str1,$str2,$str3';
    print(str4);
    }
    
    3.4. 集合类型

    1.集合类型的定义
    List:数组 / Set:集合 / Map:字典(映射)

    var letters = ['a','b','c'];
    List<int> numsList = [1,2,3];
    print('$letters,${letters.runtimeType},$numsList,${numsList.runtimeType}');
    //[a, b, c],List<String>,[1, 2, 3],List<int>
    
    Set<int> numsSet = {1,2,3,4};
    print('$numsSet,${numsSet.runtimeType}');
    //{1, 2, 3, 4},_CompactLinkedHashSet<int>
    
    Map<String, Object> map = {'name': 'yh', 'height': 1.88};
    print('$map,${map.runtimeType}');
    //{name: yh, height: 1.88},_InternalLinkedHashMap<String, Object>
    

    2.集合的常见操作

    print(letters.length);
    print(numsSet.length);
    print(objsMap.length);
    
    //list操作
    //增,删,包含
    numsList.add(5);
    numsSet.add(5);
    
    numsList.remove(1);
    numsList.removeAt(1);
    
    numsList.contains(4);
    
    print(numsList);//[2, 5]
    
    //map操作
    //1.根据key获取value
    print(objsMap['name']);//yh
    //2.获取所有的entries
    print('${objsMap.entries},${objsMap.entries.runtimeType}');//(MapEntry(name: yh), MapEntry(height: 1.88)),MappedIterable<String, MapEntry<String, Object>>
    //3.all keys
    print(objsMap.keys);//(name, height)
    //4.all values
    print(objsMap.values);//(yh, 1.88)
    //5.contain key || contain value
    print('${objsMap.containsKey('name')},${objsMap.containsValue('yh')}');//true,true
    //6.remove from key
    objsMap.remove('name');
    
    print(objsMap);//{height: 1.88}
    

    四.函数 Function

    4.1 函数定义
    //函数返回值可以省略
    
    // 返回值 函数的名称(参数列表) {
    //   函数体
    //   return 返回值
    // }
    
    void main(List<String> args) {
      print(sum(1, 2));
      print(sum2(1, 2));
    }
    
    int sum(num1, num2) {
      return num1 + num2;
    }
    
    //注意:这里只能是一个表达式,不能是一个语句
    sum2(num1, num2) => num1 + num2;
    
    4.2 函数的参数

    可选参数
    注意, 只有可选参数才可以有默认值, 必须参数不能有默认值

    //命名可选参数: {param1, param2, ...}
    //位置可选参数: [param1, param2, ...]
      
    //命名可选参数
    optionParamsFun1(String name, {int age = 10, double height = 1.8}) {
        print('$name,$age,$height');
    }
    //调用
    optionParamsFun1('yh');
    optionParamsFun1('yh',age: 20);
    optionParamsFun1('yh',age: 20,height: 1.88);
    // yh,10,1.8
    // yh,20,1.8
    // yh,20,1.88
    
    //位置可选参数
    optionParamsFun1(String name, [int age = 10, double height = 1.8]) {
        print('$name,$age,$height');
    }
    optionParamsFun1('yh');
    optionParamsFun1('yh', 20);
    optionParamsFun1('yh', 20, 1.88);
    // yh,10,1.8
    // yh,20,1.8
    // yh,20,1.88
    
    4.3. 函数是一等公民

    函数可以作为参数、返回值

    //调用
    test(getFunc());
    
    //1.定义一个函数
    foo(String name) {
      print(name);
    }
    //2.将函数作为另一个函数的返回值
    getFunc() {
     return foo; 
    }
    //3.将函数作为另一个函数的参数
    test(Function func) {
      func("func");
    }
    
    4.4. [匿名函数]
    void main(List<String> args) {
    //匿名函数
      var movies = ['盗梦空间', '星际穿越', '少年派', '大话西游'];
      //1.定义匿名函数
      printElement(item) {
        print(item);
      }
      movies.forEach(printElement);
    
      //2.使用forEach遍历:匿名函数
      movies.forEach((element) {
        print(element);
      });
      movies.forEach((element) => print(element));
    }
    
    4.5. 词法作用域

    dart中的词法有自己明确的作用域范围,它是根据代码的结构({})来决定作用域范围的
    优先使用自己作用域中的变量,如果没有找到,则一层层向外查找。

    var name = 'global';
    main(List<String> args) {
      // var name = 'main';
      void foo() {
        // var name = 'foo';
        print(name);
      }
      foo();
    }
    
    4.6. [闭包]作用域

    闭包可以访问其词法范围内的变量,即使函数在其他地方被使用,也可以正常的访问。

    void main(List<String> args) {
    
      sum(num m) {
        return (num n) {
          return m + n;
        };
      }
    
      var func = sum(10);
      print(func(10));//20
    }
    
    4.7. 返回值问题

    所有函数都返回一个值。如果没有指定返回值,则语句返回null;隐式附加到函数体。

    main(List<String> args) {
      print(foo()); // null
    }
    
    foo() {
      print('foo function');
    }
    

    五.运算符

    5.1.普通运算符
    1. 除法、整除、取余
      var num = 7;
      print(num / 3);//除 2.3333
      print(num ~/ 3);//整除 2
      print(num % 3);//取余 1
    

    2.??=

    //当变量不为null时使用变量,当变量为null时,后面的值将被赋值给变量
      var name = 'lucy';
      name ??= 'sala';
      print(name);//lucy
    
      var name2 = null;
      name2 ??= 'Toms';
      print(name2);//Toms
    

    3.??

    //当变量不为null时使用变量,当变量为null时使用后面的值
      var name = 'lucy';
      print(name ?? 'sala');//lucy
    
      var name2 = null;
      print(name2 ?? 'Toms');//Toms
    

    5.2. 级联语法:…
    对一个对象进行连续的操作,这个时候可以使用级联语法。

    class Person {
      String name = 'Tom';
      void eat() {
      }
      void drink() {
      }
      void sleep() {
      }
    }
    
    void main(List<String> args) {
    
      final p1 = Person();
      p1.name = 'Lucy';
      p1.eat();
      p1.drink();
      p1.sleep();
      //级联
      final p2 = Person()
                ..name = "Tom"
                ..eat()
                ..drink()
                ..sleep();
    
    }
    

    5.3. if else
    dart不支持非零即真,判断语句中必须有明确的bool类型

      var isBool = true;
      if (isBool) {
      } else {
      }
    

    5.4. switch-case

      var direction = 'east';
      switch (direction) {
        case 'east':
          print('东方');
          break;
        case 'west':
          print('西方');
          break;
    
        default:
          print('其他方');
      }
      //东方
    

    5.5. 循环
    for、for in

      var list = ['1','2','3'];
      for (var i = 0; i < list.length; i++) {
        print(list[i]);
      }
      
      for (var str in list) {
        print(str);
      }
      //1 2 3
    

    while do-while 与其他语法一致
    break continue 与其他语法一致

    六.枚举 enum

    6.1.枚举的定义

    枚举使用 enum关键字 来定义:

    void main(List<String> args) {
      print(Colors.red);
      //枚举属性 index索引,从0开始;values包含所有枚举值的list
      print(Colors.red.index);
      print(Colors.values);
    }
    
    enum Colors {
      red,
      green,
      blue
    }
    

    ————————————————
    版权声明:本文为CSDN博主「weixin_42580612」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_42580612/article/details/124137706

    相关文章

      网友评论

          本文标题:Flutter之Dart基础语法(一)

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