微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dart:继承抽象类的方法

如何解决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);

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

我在做什么错了?

解决方法

在dart中,没有静态成员的继承。在此处查看Language Specification-

静态方法的继承在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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。