首页 > 解决方案 > 如何将列表功能合并到自定义模型类中

问题描述

我正在尝试将标准列表功能包含到对象模型中,但我终生无法解决。

这就是我正在做的

所以,我可以很容易地去 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});
}

标签: listflutterdartmodel

解决方案


如果您希望您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);
}

推荐阅读