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, }; ... 现在您的抽象类将是一个纯接口类,没有实现,也不存储数据