覆盖抽象类Dart中的最终属性

问题描述

我创建了一个抽象类,其中包含 Stateless Widget 可以覆盖但由于实现 Stateless Widget不变性 ,我必须使小部件属性最终确定,然后使Abstract类属性也最终确定。然后,我得到一个错误,那就是必须初始化最终变量。

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

抽象类

abstract class BusinessCard {
  final CardView cardView;
  final CardInfo cardInfo;
  Widget front(BuildContext context);
  Widget back(BuildContext context);
}

实施班

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) {
    
  }
}

解决方法

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

因此,您可以使用抽象的getter和setter来代替最终类的成员。

您还可以在dart sdk Github存储库https://github.com/dart-lang/sdk/issues/28555

中发布的类似问题中阅读此评论。 ,
  1. abstract类不能自行构造,但仍可以具有派生类可以调用的构造函数。抽象基类中的构造函数可以初始化其final成员。

  2. 数据成员向接口隐式添加getter和setter。 final个成员隐式地添加不带setter的getter。这意味着您的课程可能是:

    abstract class BusinessCard {
      CardView get cardView;
      CardInfo get cardInfo;
      Widget front(BuildContext context);
      Widget back(BuildContext context);
    }
    
    class Card1 extends StatelessWidget implements BusinessCard {
      @override
      final CardView cardView;
    
      @override
      final CardInfo cardInfo;
    
      Card1({
        @required this.cardView,@required this.cardInfo,});
      ...
    

    现在您的抽象类将是一个纯接口类,没有实现并且不存储任何数据。

,

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

// 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,});

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

  @override
  Widget front(BuildContext context) {

  }

  @override
  Widget back(BuildContext context) {
    
  }
}
,

我建议:

abstract class BusinessCard extends StatelessWidget {
  BusinessCard({
    this.cardView,this.cardInfo,});

  final CardView cardView;
  final CardInfo cardInfo;

  Widget front(BuildContext context);
  Widget back(BuildContext context);
}
class Card1 extends BusinessCard {
  Card1({
    @required CardView cardView,@required CardInfo cardInfo,}) : super(
          cardView: cardView,cardInfo: cardInfo,);

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

  @override
  Widget front(BuildContext context) {}

  @override
  Widget back(BuildContext context) {}
}