命名构造方法出错

来源:5-8 带你揭开Flutter中的面向对象(命名构造方法)

慕莱坞0998854

2021-06-25

如图
图片描述

图片描述

不知道问题在哪 希望老师能抽空解答一下。

写回答

1回答

CrazyCodeBoy

2021-06-28

两种方案:

方案一:将Dart SDK版本修改成兼容版本:

将pubspec.yaml中的sdk由>=2.12.0改为>=2.7.0

environment:
  sdk: ">=2.7.0 <3.0.0"
#  sdk: ">=2.12.0 <3.0.0"

方案二:参考下下面的实现适配下空安全:

///面向对象(OOP)
class Student extends Person {
  //定义类的变量
  late String _school; //通过下划线来标识私有字段(变量)
  String? city;
  String? country;
  late String name;

  ///构造方法:
  ///通this.school初始化自有参数
  ///name,age交给父类进行初始化
  ///city为可选参数
  ///country设有默认参数
  Student(this._school, String name, int age,
      {this.city, this.country = 'China'})
      //初始化列表:除了调用父类构造器,在子类构造器方法体之前,你也可以初始化实例变量,不同的初始化变量之间用逗号分隔开
      : name = '$country.$city',
        //如果父类没有默认构造方法(无参构造方法),则需要在初始化列表中调用父类构造方法进行初始化
        super(name, age) {
    //构造方法体不是必须的
    print('构造方法体不是必须的');
  }

  //命名构造方法:[类名+.+方法名]
  //使用命名构造方法为类实现多个构造方法
  Student.cover(Student stu) : super(stu.name, stu.age) {
    print('命名构造方法');
  }

  //命名工厂构造方法:factory [类名+.+方法名]
  //它可以有返回值,而且不需要将类的final变量作为参数,是提供一种灵活获取类对象的方式。
  factory Student.stu(Student stu) {
    return Student(stu._school, stu.name, stu.age,
        city: stu.city, country: stu.country);
  }

  @override
  String toString() {
    return 'name:$name school:${this._school},city:$city,country:$country ${super.toString()}';
  }

  //可以为私有字段设置getter来让外界获取到私有字段
  String get school => _school;

  //可以为私有字段设置setter来控制外界对私有字段的修改
  set school(String value) {
    _school = value;
  }

  //静态方法
  static doPrint(String str) {
    print('doPrint:$str');
  }

  ///科普小知识:实例方法,对象的实例方法可以访问到实例变量与this,如上述代码中的toString
}

///定一个Dart类,所有类都继承自Object
class Person {
  String name;
  int age;

  Person(this.name, this.age);

  ///重写父类方法
  @override
  String toString() {
    return 'name:$name, age:$age';
  }
}

///工厂构造方法演示
class Logger {
  static Logger? _cache;

//  工厂构造方法:
//  不仅仅是构造方法,更是一种模式
//  有时候为了返回一个之前已经创建的缓存对象,原始的构造方法已经不能满足要求
//  那么可以使用工厂模式来定义构造方法
  factory Logger() {
    return _cache ??= Logger._internal();
  }

  Logger._internal();

  void log(String msg) {
    print(msg);
  }
}

///继承抽象类要实现它的抽象方法,否则也需要将自己定义成抽象类
class StudyFlutter extends Study {
  @override
  void study() {
    print('Learning Flutter');
  }
}

///使用 abstract 修饰符来定义一个抽象类,该类不能被实例化。抽象类在定义接口的时候非常有用,实际上抽象中也包含一些实现
abstract class Study {
  void study();
}

///为类添加特征:mixins
///mixins 是在多个类层次结构中重用代码的一种方式
///要使用 mixins ,在 with 关键字后面跟一个或多个 mixin 的名字(用逗号分开),并且with要用在extends关键字之后
///mixins的特征:实现 mixin ,就创建一个继承 Object 类的子类(不能继承其他类),不声明任何构造方法,不调用 super
///猜猜上面的类中哪个是mixin?

class Test extends Person with Study {
  Test(String name, int age) : super(name, age);

  @override
  void study() {
    // TODO: implement study
  }
}


3
0

Flutter从入门到进阶 实战携程网App 一网打尽核心技术

解锁Flutter开发新姿势,,系统掌握Flutter开发核心技术。

4788 学习 · 3270 问题

查看课程