flutter - 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'.
我究竟做错了什么?
解决方案
在 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);
推荐阅读
- mongodb - 连接 mongo atlas 集群时出现 ServerSelectionTimeoutError,同时在 azure machine learning studio 上导入 mongo db 数据
- excel - Excel 将工作表从关闭的文件打印到 PDF
- android - android ndk dev 使用c traceroute 命令,为什么收不到超时回显?
- angular - 我的愿望清单产品未显示 Ionic 中登录用户的愿望清单
- java - 如何查看 application.properties 文件中的属性引用的位置?
- telegram - 在电报机器人中获取电话号码的聊天ID的方法
- css - 基于 React Native 的 FlexBasis
- git - Git Credential Manager 不断为 Azure Devops 生成 PAT
- infer.net - GaussianProductOp.ProductAverageConditional - has quality band Experimental which is less than the recommended quality band (Preview)
- sql - 复杂的 SQL 查询请求