Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 重写抽象类Dart中的最终属性_Flutter_Oop_Dart_Design Patterns_Abstract Class - Fatal编程技术网

Flutter 重写抽象类Dart中的最终属性

Flutter 重写抽象类Dart中的最终属性,flutter,oop,dart,design-patterns,abstract-class,Flutter,Oop,Dart,Design Patterns,Abstract Class,我创建了一个抽象类,其中包含无状态小部件可以覆盖的方法和属性,但在实现该类之后,由于无状态小部件的不可变性,我必须使小部件属性为最终属性,进而使抽象类属性为最终属性。然后,我得到了最后一个变量必须初始化的错误 用最终变量实现抽象类的正确方法是什么 抽象类 实现类 class Card1 extends StatelessWidget implements BusinessCard { final CardView cardView; final CardInfo cardInfo;

我创建了一个抽象类,其中包含无状态小部件可以覆盖的方法和属性,但在实现该类之后,由于无状态小部件的不可变性,我必须使小部件属性为最终属性,进而使抽象类属性为最终属性。然后,我得到了最后一个变量必须初始化的错误

用最终变量实现抽象类的正确方法是什么

抽象类

实现类

class Card1 extends StatelessWidget implements BusinessCard {
  final CardView cardView;
  final CardInfo cardInfo;

  Card1({
    @required this.cardView,
    @required this.cardInfo,
  });

  @override
  Widget build(BuildContext context) {
    return cardView == CardView.front ? front(context) : back(context);
  }

  @override
  Widget front(BuildContext context) {

  }

  @override
  Widget back(BuildContext context) {
    
  }
}

您总是可以忽略不可变的,但要小心这一行

// ignore: must_be_immutable
所以你的抽象类是

abstract class BusinessCard {
  CardView cardView;
  CardInfo cardInfo;
  Widget front(BuildContext context);
  Widget back(BuildContext context);
}
还有你的无状态小部件

// ignore: must_be_immutable
class Card1 extends StatelessWidget implements BusinessCard {
  CardView cardView;
  CardInfo cardInfo;

  Card1({
    @required this.cardView,
    @required this.cardInfo,
  });

  @override
  Widget build(BuildContext context) {
    return cardView == CardView.front ? front(context) : back(context);
  }

  @override
  Widget front(BuildContext context) {

  }

  @override
  Widget back(BuildContext context) {
    
  }
}

您总是可以忽略不可变的,但要小心这一行

// ignore: must_be_immutable
所以你的抽象类是

abstract class BusinessCard {
  CardView cardView;
  CardInfo cardInfo;
  Widget front(BuildContext context);
  Widget back(BuildContext context);
}
还有你的无状态小部件

// ignore: must_be_immutable
class Card1 extends StatelessWidget implements BusinessCard {
  CardView cardView;
  CardInfo cardInfo;

  Card1({
    @required this.cardView,
    @required this.cardInfo,
  });

  @override
  Widget build(BuildContext context) {
    return cardView == CardView.front ? front(context) : back(context);
  }

  @override
  Widget front(BuildContext context) {

  }

  @override
  Widget back(BuildContext context) {
    
  }
}

无法重新分配最终变量,它具有最终值,因此请尝试将其删除。。在实现抽象类时,您不需要添加最终变量,因为该类被视为模板或一般情况,您希望在应用程序中重用它

因此,不使用最终类成员,而是使用抽象的getter和setter


您也可以在dart sdk Github repo中发布的类似问题中阅读此评论:

无法重新分配最终变量,它具有最终值,因此请尝试删除它。。在实现抽象类时,您不需要添加最终变量,因为该类被视为模板或一般情况,您希望在应用程序中重用它

因此,不使用最终类成员,而是使用抽象的getter和setter

您也可以在dart sdk Github repo上发布的类似问题中阅读此评论:

我建议:

抽象类BusinessCard扩展了无状态小部件{ 名片{ 这是cardView, 这是cardInfo, }; 最终卡视图卡视图; 最终的CardInfo CardInfo; 语境语境; 小部件创建上下文上下文; } 我建议:

抽象类BusinessCard扩展了无状态小部件{ 名片{ 这是cardView, 这是cardInfo, }; 最终卡视图卡视图; 最终的CardInfo CardInfo; 语境语境; 小部件创建上下文上下文; } 抽象类不能自己构造,但它仍然可以有派生类可以调用的构造函数。抽象基类中的构造函数可以初始化其最终成员

数据成员隐式地向接口添加getter和setter。最终成员在不使用setter的情况下隐式添加getter。这意味着您的类可以是:

抽象类名片{ CardView获取CardView; CardInfo获得CardInfo; 语境语境; 小部件创建上下文上下文; } 类Card1扩展了实现名片的小部件{ @凌驾 最终卡视图卡视图; @凌驾 最终的CardInfo CardInfo; 卡片1{ @需要此.cardView, @需要这个.cardInfo, }; ... 现在您的抽象类将是一个纯接口类,没有实现,也不存储数据

抽象类不能自己构造,但它仍然可以有派生类可以调用的构造函数。抽象基类中的构造函数可以初始化其最终成员

数据成员向接口隐式添加getter和setter。最终成员隐式添加getter而不添加setter。这意味着您的类可以是:

抽象类名片{ CardView获取CardView; CardInfo获得CardInfo; 语境语境; 小部件创建上下文上下文; } 类Card1扩展了实现名片的小部件{ @凌驾 最终卡视图卡视图; @凌驾 最终的CardInfo CardInfo; 卡片1{ @需要此.cardView, @需要这个.cardInfo, }; ... 现在您的抽象类将是一个纯接口类,没有实现,也不存储数据