首页 > 解决方案 > Dart:从抽象类继承方法

问题描述

试图创建一个通用路由“基类”,其中一个abstract类定义了一个返回路由名称的 getter。像这样的东西:

abstract class ScreenAbstract extends StatefulWidget {
  static String name;

  static String get routeName => '/$name';

  ScreenAbstract({Key key}) : super(key: key);
}

然后,任何“屏幕”小部件都可以扩展此类:

class SomeScreen extends ScreenAbstract {
  static final name = 'someScreen';

  SomeScreen({Key key}) : super(key: key);

  @override
  _SomeScreenState createState() => _SomeScreenState();
}

然后应该可以像这样访问:

Navigator.of(context).pushNamed(SomeScreen.routeName);

但是,在尝试这样做时,linter 会引发错误: The getter 'routeName' isn't defined for the type 'SomeScreen'.

我究竟做错了什么?

标签: flutterdartabstract-class

解决方案


在 dart 中没有静态成员的继承。请参阅此处的语言规范-

静态方法的继承在 Dart 中几乎没有用处。静态方法不能被覆盖。任何需要的静态函数都可以从其声明库中获取,无需通过继承将其引入作用域。经验表明,开发人员对继承方法不是实例方法的想法感到困惑。

当然,静态方法的整个概念是值得商榷的,但在这里保留它是因为很多程序员都熟悉它。Dart 静态方法可以看作是封闭库的函数。

为了解决这个问题,您可以像这样更新您的解决方案 -

抽象父类 -

abstract class ScreenAbstract extends StatefulWidget {
  final String _name;
  String get routeName => '/$_name';
  ScreenAbstract(this._name, {Key key}) : super(key: key);
}

扩展父类的屏幕小部件 -

class SomeScreen extends ScreenAbstract {  
  static final String name = "url";
  SomeScreen({Key key}) : super(name, key: key);

  @override
  _SomeScreenState createState() => _SomeScreenState();
}

然后你可以像这样访问它 -

Navigator.of(context).pushNamed(SomeScreen().routeName);

推荐阅读