list - 如何将列表功能合并到自定义模型类中
问题描述
我正在尝试将标准列表功能包含到对象模型中,但我终生无法解决。
这就是我正在做的
- 使用包含章节、每章的 href 链接等的 EPUB XML 文件
- 每个章节和相关信息都被拉入一个模型/对象
- 解析 XML 文件以获取所需信息很好
- 为单个元素创建模型并分配解析的信息很好
- 但是,我无法解决创建允许我使用 .add .length 或访问任何标准列表功能的单个元素的模型 LIST 的问题。
所以,我可以很容易地去 List listOfIndividualItems = [] 然后 .add
但是我如何将其合并到模型/对象场景中(比如): BookReference bookReference ;然后 bookReference.add ?
当然我不需要为我的模型创建 .add() 方法等并且可以以某种方式继承?
以下是我的模型。谢谢你的帮助。
class BookDirectoryItem {
final String mediaType, href;
final int order;
final String idRef;
BookDirectoryItem(
{required this.href,
required this.mediaType,
required this.idRef,
required this.order});
}
class BookDirectory {
final List<BookDirectoryItem> bookDirectoryItems;
BookDirectory({required this.bookDirectoryItems});
}
解决方案
如果您只希望您BookDirectory
的行为与 a 相同List<BookDirectoryItem>
,只需使用 Dart 2.13 的新功能创建一个类型别名。
要利用此功能,您需要将 pubspec.yaml 中的最小 sdk 约束更改为 2.13:
environment:
sdk: ">=2.13.0 <3.0.0"
然后在你的代码中你可以做
typedef BookDirectory = List<BookDirectoryItem>;
然后 usingBookDirectory
将与List<BookDirectoryItem>
.
如果你想添加额外的功能,你可以使用扩展方法来做到这一点:
extension Books on BookDirectory {
BookDirectory mediaTypeSubDirectory(String mediaType) {
BookDirectory newDir = [];
for (BookDirectoryItem item in this) {
if(item.mediaType == mediaType) {
newDir.add(item);
}
}
return newDir;
}
}
如果由于某种原因这是不可取的,您必须手动将一些列表功能添加到您的类中,尽管使用ListMixin
. 你只需要定义一些函数,mixin 会处理剩下的。
import 'dart:collection';
class BookDirectory with ListMixin<BookDirectoryItem> {
final List<BookDirectoryItem> bookDirectoryItems;
BookDirectory({required this.bookDirectoryItems});
int get length => bookDirectoryItems.length;
set length(int v) {
bookDirectoryItems.length = v;
}
BookDirectoryItem operator[](int index) => bookDirectoryItems[index];
operator[]=(int index, BookDirectoryItem value) {
bookDirectoryItems[index] = value;
}
void add(BookDirectoryItem item) => bookDirectoryItems.add(item);
}