flutter - 在 Dart 中覆盖类字段的最佳实践
问题描述
我正在为我的应用程序创建一个主题系统,我希望在其中创建一个基本主题类,其中包含颜色和字体字段:
abstract class BaseTheme {
late Color backgroundColor;
late Color appBarBackgroundColor;
late Color progressIndicatorColor;
late Color primaryColor;
late Color iconColor;
}
(我必须将它们定义为late
保持 Null Safety 快乐!无论如何这些都必须被覆盖,所以那里没有问题)。
然后我会implement
为每个主题创建这个基类,如下所示:
import 'base_theme.dart';
class LightTheme implements BaseTheme {
Color backgroundColor = Colors.white;
Color appBarBackgroundColor = Color(0xff1a1818);
Color progressIndicatorColor = Color(0xffffc114);
Color primaryColor = Colors.red;
Color iconColor = Colors.white;
}
然后我将使用这些值来填充ThemeData
:
BaseTheme _lightTheme = new LightTheme();
ThemeData _theme = ThemeData(
scaffoldBackgroundColor: _lightTheme.backgroundColor,
// etc...
}
现在,这似乎工作正常。但是,Linter for Dart 中有关覆盖字段的页面指出,覆盖字段是不好的做法。那么,有没有更好的方法来实现类似的目标?
令人困惑的是,在该页面上,当您extend
使用基类时,一个示例显示了覆盖字段,这被认为是不好的。但是,当您使用基类时覆盖字段implement
是好的 - 但在这种情况下,字段类型已更改Base
为Derived
(即它们不一样)。
任何指针(没有双关语)都是最受欢迎的!
解决方案
正如 lint 建议的那样,您应该避免覆盖字段。你的抽象类应该定义一个接口;因此,它应该声明getter和setter,并将实现留给具体的派生类。请注意,这避免了对late
(这是一个不属于抽象基类的实现细节)的需要。
abstract class BaseTheme {
Color get backgroundColor;
set backgroundColor(Color value);
Color get appBarBackgroundColor;
set appBarBackgroundColor(Color value);
// etc.
}
Dart 2.13 允许将成员声明为abstract
,因此您可以使用它来避免重复:
abstract class BaseTheme {
abstract Color backgroundColor;
abstract Color appBarBackgroundColor;
// etc.
}
另请参阅 GitHub 问题:overridden_fields 文档是 vague。
推荐阅读
- javascript - React - 默认步骤的输入范围作为值数组
- python - 为什么 TfidVectorizer.fit_transform() 会更改我的文本数据的样本和标签数量?
- python - 从python字符串数组中删除子字符串
- jenkins - 如何在 Jenkins 声明式管道的 steps.sh 脚本中声明一个新变量?
- azure-cosmosdb - 将数组对象转换为小写以在 CosmosDB 查询中进行比较
- python - 为什么我的二进制搜索比线性搜索慢(python)
- r - R - 识别并删除在另一个矩阵中有重复的矩阵行
- docker - Docker COPY 成功但检查无文件
- postgresql - 使用 NestJS 和 TypeOrm,在我运行 NestJS 应用程序后不会自动创建表
- confluent-schema-registry - 如何忽略 kafka jdbc sink 连接器中的错误消息?