如何在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
相关产品推荐
相关产品推荐

