【问题标题】:How to incorporate List Functionality in a custom model class如何将列表功能合并到自定义模型类中
【发布时间】:2021-07-16 02:13:26
【问题描述】:

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

这就是我正在做的事情

  • 使用包含章节、每章的 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});
}

【问题讨论】:

    标签: list flutter dart model


    【解决方案1】:

    如果您希望 BookDirectory 的行为与 List&lt;BookDirectoryItem&gt; 相同,只需使用 Dart 2.13 的新功能创建一个类型别名。

    要使用此功能,您需要将 pubspec.yaml 中的最小 sdk 约束更改为 2.13:

    environment:
      sdk: ">=2.13.0 <3.0.0"
    

    然后在你的代码中你可以做

    typedef BookDirectory = List<BookDirectoryItem>;
    

    那么使用BookDirectory 将等同于List&lt;BookDirectoryItem&gt;

    如果你想添加额外的功能,你可以使用扩展方法来做到这一点:

    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);
    }
    

    【讨论】:

    • 上述两种解决方案都非常有效。标记为已回答。谢谢大家。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多