美文网首页
Flutter学习笔记2 -- Dart语法学习

Flutter学习笔记2 -- Dart语法学习

作者: percivals | 来源:发表于2021-08-04 19:41 被阅读0次

    本章主要对Dart语法进行介绍,以及运行过程

    使用前准备

    1. Dart安装
      进行Dart环境变量的配置,学习笔记1中已经介绍过了
      安装插件Flutter、Dart、code runner

    2. 程序入口 main函数 (参数可不写)

    main(List<String> args) {
      print("hello world");
    }
    
    1. 声明变量
    • 明确声明
    String name = "why";
    
    • 类型推导
      关键字var、final、const、Object、dynamic
      var声明变量
      final、const声明常量
      const必须赋值常量值,编译时就需要确认值
      final可以通过计算、函数来获取一个值,即运行时确定值
     var age = 20;
     const sex = "boy";
     final today = DateTime.now();
    

    Object类型为所有类型的基类,可以指代任何类型,所以可以重新赋值为新的类型数据,调用方法编译时可能报错

    Object s = 23;
    s = "赵四";
    print(s);  //赵四
    

    dynamic表示动态类型,类似于Any,可以在编程过程中改变变量类型,所以可以重新赋值为新的类型数据,调用方法运行时可能会报错

    dynamic s = 23;
    s = "赵四";
    print(s);  //赵四
    

    var是关键字,Object、dynamic是类型
    疑问: 以下代码为什么会报错

    class Person {
      String name;
      
      Person(String name) {
        this.name = name;
      }
    }
    
    1. 数据类型
      参考: https://www.jianshu.com/p/05daef045e8d
      注意: Dart的bool类型没有非空即真的概念
      数值变量:int、double、num
      字符串:String
      集合类型:List、Map、Set
      List形式: ["ab","bc","cd"]
      Set形式:{"ab","bc","cd"}, Set中无重复元素

    2. 函数的基本使用

    1)基本样式如下:

    int sum(int num1, int num2) {
      return num1 + num2;
    }
    
    

    返回值的类型(int)可以省略,但是不推荐,不利于阅读及代码规范

    2)函数的可选参数 位置可选参数 及 命名可选参数

    • Dart中没有函数的重载
    • 位置可选参数:实参和形参在进行匹配时,是根据位置进行匹配的, 顺序不可混乱,使用[ ]进行定义
    main(List<String> args) {
      sayHello("zhangsan");
    }
    
    // 位置可选参数
    void sayHello(String name, [int? age, double? height]) {
      print("hello,$name,age:$age,height:$height");
    }
    
    • 命名可选参数: 实参和形参在进行匹配时,是根据参数名进行匹配的, 顺序可以颠倒,使用{ }进行定义
    main(List<String> args) {
      sayHi("lisi");
      sayHi("lisi", height: 170.0, age: 20);
    }
    
    // 命名可选参数
    void sayHi(String name, {int? age, double? height}) {
      print("hi,$name,age:$age,height:$height");
    }
    
    

    3)参数可以有默认值
    *只有可选参数才能有默认值

    void sayHi(String name, {int? age = 12, double? height}) {
      print("hi,$name,age:$age,height:$height");
    }
    
    
    1. 函数是第一公民 支持灵活传递 Function类型
      函数可以作为另一个函数的参数
      1)函数
    void test() {
    
    }
    

    2) 匿名函数

    main(List<String> args) {
      test(() {
        print("这是一个匿名函数");
      });
    }
    
    void test(Function foo) {
      foo();
    }
    
    

    3) 箭头函数
    函数体只有一行的时候才能用箭头函数

    test(() => print("这是一个箭头函数"));
    
    1. 函数签名
      使用typedef配合函数签名,增强代码可读性
    main(List<String> args) {
      int calNum = test1((int a, int b) {
        return a + b;
      });
      print("$calNum");
    }
    
    typedef add = int Function(int, int);
    int test1(add cal) {
      return cal(1, 2);
    }
    

    5)函数作为返回值

    add addFun() {
      return (num1, num2) {
        return num1 + num2;
      };
    }
    
    1. 特殊运算符
    • 赋值运算符 ??=
      当原来的变量为null,才进行赋值
    String? name = null;
      name ??= "lisi";
      print(name);
    
    • 级联运算符 ..
    main(List<String> args) {
      Person()
        ..name = "zhangsan"
        ..eat()
        ..run();
    }
    
    class Person {
      String? name;
      void run() {
        print("$name run");
      }
    
      void eat() {
        print("$name eat");
      }
    }
    

    8.类

    • 构造函数
      在Dart语言中如果没有显式声明构造函数,系统会提供默认无参的构造函数,但如果显式声明了构造函数,系统不再提供默认的无参构造函数。
      构造函数不能声明返回值类型,函数名必须与类名一致
    class NumberTest{
      num a;
      num b;
      NumberTest(num a, num b){
        this.a = a;
        this.b = b;
      }
    }
    

    上面示例的构造函数也可以写成下面这种语法糖,效果是一样的。

     NumberTest(this.a, this.b){}
    

    Dart的语法不支持函数重载,因此当需要使用多个构造函数时,需要使用命名构造函数这种形式

    void main(){
      var a = new NumberTest(2,3);
      var b = new NumberTest.cons1();
      var c = new NumberTest.cons2(5);
      a.display();
      b.display();
      c.display();
    }
    
    class NumberTest{
      num a;
      num b;
    
      NumberTest(this.a, this.b){} //构造函数
      NumberTest.cons1(){//命名构造函数1
        this.a = 0;
        this.b = 0;
      }
      NumberTest.cons2(this.a){//命名构造函数2
        this.a = a;
        this.b = 0;
      }
      void display(){
        print("数据:${this.a},${this.b}");
      }
    }
    

    当需要构造函数之间互相调用时需要使用this关键字

      NumberTest(this.a, this.b){} //构造函数
      NumberTest.cons1() : this(0,0); //命名构造函数1
      NumberTest.cons2(num a) : this(a, 0); //命名构造函数2
    
    • 初始化列表
      构造函数参数列表后面,{ 符号之前,在这个地方可以写一些语句,使用符号: 实现,多个语句用逗号,隔开
      示例:在构造函数参数列表后进行属性赋值,final属性必须在构造函数{}之前完成赋值
    class Animal {
      final int age;
      final String name;
    
      Animal(this.name, {int? age}) : this.age = age ?? 10 {}
    }
    

    类似于

    Animal(this.name, {this.age = 10}) {}
    

    相关文章

      网友评论

          本文标题:Flutter学习笔记2 -- Dart语法学习

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