引言

       

构造函数作用

1.  在Dart 类中,与类同名的函数叫做构造函数。目的是类的实例化时,给实例化的元素传递默认值。(避免实例化的元素属性为空,引发异常)

2.  每个类中都必须有构造函数,这是Dart语法规则;用户不写,Dart也会自动添加无参构造函数

3.  Flutter 需要构造函数原因

  1. Widget 初始化:设置 Widget 初始状态和行为
  2. 配置传递:接收外部传入的配置参数和数据
  3. 性能优化:通过 const 构造函数提高渲染性能
  4. 代码复用:通过不同的构造函数提供多种初始化方式
  5. 继承支持:配置 super 关键字实现类的继承关系

为什么父类定义了构造函数,子类继承父类后还需要定义构造函数?

        在Dart中,构造函数 是不会被子类继承的,所有当定义一个继承类时,继承类还是要重新定义构造函数。

// 构造函数示例
class Student {
    int id;
    String name;
    int age;
    
    
    // 构造函数 标准写法(语法糖)
    Student(this.id, this.name, this.age);

    // 写法2 添加函数体内容
    Student(this.id, this.name, this.age) {
        print("构造函数运行!");
    }

    // 构造函数 分解写法(不惯用)
    Student(int id, String name, int age) 
   {
        this.id = id;       
        this.name = name;
        this.age = age;
    }
}
// 类继承 + 子类传递元素默认值给父类写法
// 父类
class Student {
    int id;
    String name;
    int age;
    
    Student(this.id, this.name, this.age);
}

// 子类继承父类
class Boy_Student extends Student {
    int score;

    // 子类构造函数
    // 因父类构造为设置默认值,子类构造函数必须同步传递默认值给父类元素
    Boy_Student (this.score, int id, String name, int age) : super(id, name, age)
    {
        // 构造函数函数体
        // add code ...
    }
}

关于 this 与 super

this 用于指向当前类的实例,意思是传递实参给类元素

super 用于指向父类中的构造函数参数 ,意思是通过子类中构造函数传递参数给父类中构造函数

关于传递

1,当子类继承父类,父类构造函数没有默认值时,子类定义构造函数时必须为父类元素传递默认值。

//  通过传递给父类的构造函数,间接传递给父类元素

示例:Boy_Student (int id, String name, int age, this.score) : super(id, name, age)

2,当子类继承父类,父类构造函数有默认值时,子类可以不强制传递默认值给父类构造函数。

示例:父类构造函数有默认值情况

Student(this.id = 0, this.name = ”未知学生“, this.age = 18)

3,当父类构造函数是无参构造函数,子类构造函数可以不显性写 super()

Flutter Demo 代码理解

// 从Dart语法规则 解释 Flutter Demo 含义

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());  // 将类的实例化传递给函数
}

class MyApp extends StatelessWidget {   // 定义一个类,继承自StatelessWidget类
  const MyApp({   // 子类定义自己的构造函数
      super.key,  // 子类未定义新属性或方法,但根据Dart语法规则,需要为 父类构造函数 key参数 传递值(类内定义,实例化时传递)
    });
  
  // 重写父类build方法,定义UI构建逻辑
  @override   // 重写标识
  Widget build(BuildContext context) // 在子类MyApp中重写父类StatelessWidget buld方法
  {
    return MaterialApp(   // 重写内容为 实例化MaterialApp类,实例化时设置MaterialApp类中各种属性或方法的值
      title: 'Flutter Demo',
      theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple)),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐