You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dart自定义模型类中集成List的标准操作功能

实现方案

Dart 官方已经提供了简化继承List能力的封装,无需手动实现所有List相关方法,通过继承dart:collection包中的ListBase即可自动获得add、length、remove等全部标准List能力,仅需实现4个核心底层逻辑即可。


完整修改后的代码

import 'dart:collection';

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 extends ListBase<BookDirectoryItem> {
  // 内部实际存储章节条目的列表
  final List<BookDirectoryItem> bookDirectoryItems = [];

  // 空构造函数,支持直接初始化空目录
  BookDirectory();

  // 可选构造函数:支持传入初始条目列表快速初始化
  BookDirectory.withInitialItems(List<BookDirectoryItem> initialItems) {
    bookDirectoryItems.addAll(initialItems);
  }

  // 仅需实现以下4个核心方法,ListBase会自动生成所有标准List操作方法
  @override
  int get length => bookDirectoryItems.length;

  @override
  set length(int newLength) => bookDirectoryItems.length = newLength;

  @override
  BookDirectoryItem operator [](int index) => bookDirectoryItems[index];

  @override
  void operator []=(int index, BookDirectoryItem value) => bookDirectoryItems[index] = value;
}

使用示例

完全符合你要求的调用方式,原生List的所有方法都可以直接调用:

// 初始化目录对象
final bookReference = BookDirectory();

// 直接调用add方法添加章节
bookReference.add(
  BookDirectoryItem(
    href: "chapter1.xhtml",
    mediaType: "application/xhtml+xml",
    idRef: "ch1",
    order: 1
  )
);

// 直接获取条目数量
print(bookReference.length); // 输出:1

// 支持遍历、筛选、删除等所有原生List操作
for (var chapter in bookReference) {
  print(chapter.href);
}

实现原理

ListBase是Dart SDK内置的抽象类,已经预实现了List接口的所有默认逻辑,仅依赖上述4个最基础的存取方法实现所有上层能力,无需手动编写add、remove、forEach等冗余方法。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 13:36:03