在 dart 中覆盖类变量时出错

Posted

技术标签:

【中文标题】在 dart 中覆盖类变量时出错【英文标题】:Getting error while overriding class variables in dart 【发布时间】:2021-08-17 15:37:58 【问题描述】:

我一直在学习飞镖,但在下面的代码中遇到了一些问题,我使用默认构造函数来避免在类中使用默认值作为一种做法,但编译器说必须初始化类变量,因为这些值可以'不可为空。如果我的默认构造函数在初始化 main 中的类对象时分配这些值,是否真的需要分配类属性?请对此提供帮助。

      class Person
      
       String name;
       int age; 

        Person(String st_name, int age)
         
          name = st_name;
          this.age = age;
         
       

   void main()
   
    Person obj_p1 = new Person('Ralph',25);
    var obj_p2 = Person('Mark', 26);
    
    print(obj_p1.name);
    print(obj_p1.age);
    
    print(obj_p2.name);
    print(obj_p2.age);
    

【问题讨论】:

【参考方案1】:

编辑

要将其与命名参数一起使用,请在构造函数中为参数添加前缀required,如下所示:

class Person 
  final String name;
  final int age;

  Person(required this.name, required this.age);


为了解决这个问题,我在你的变量前面加上了 late 关键字,它通知编译器你稍后将初始化这个变量(也就是在构造函数中)。

class Person 
  late String name;
  late int age;

  Person(String st_name, int age) 
    name = st_name;
    this.age = age;
  


void main() 
  Person obj_p1 = new Person('Ralph', 25);
  var obj_p2 = Person('Mark', 26);

  print(obj_p1.name);
  print(obj_p1.age);

  print(obj_p2.name);
  print(obj_p2.age);

但是,在 Dart 中,这不是为类初始化变量的推荐方法。正确的做法如下:

class Person 
  final String name;
  final int age;

  Person(this.name, this.age);

上面的代码本质上是第一个块中的代码。 final 关键字只是告诉编译器这个变量一旦传入构造函数就不能更改。

【讨论】:

我修改了您之前提到的代码,并且运行良好。但是当我将此代码与命名参数一起使用时,它再次给出一个错误,即类变量不能为空。那么这是使用命名参数的正确方法还是我犯了任何错误,因为如果我在构造函数中初始化任何值,它就可以正常工作。代码:人(this.name,this.age);给出错误******* Person(this.name="x", this.age=20);工作正常 ******* 命名参数的主对象初始化 --- var obj_p2 = Person( name : 'Mark', age: 26); 编辑了我的答案@Keshav

以上是关于在 dart 中覆盖类变量时出错的主要内容,如果未能解决你的问题,请参考以下文章

在成员变量中使用模板类作为模板模板参数时出错

如何访问和更改在 FLUTTER/DART 的另一个类中声明的字符串变量的值

覆盖 Qt MouseEvent 但仅当类变量为 True 时

Dart 初始化最终变量

dart 类共享变量

在另外一个类中调用一个窗口类中的listbox的控制变量的成员函数出错!