如何让Dart的Iterable持久化,实现持续递增取值?
解决Flutter迭代器重复取值的问题
你的核心问题是每次调用generateFunThings()都会生成全新的迭代器实例,所以每次取值都是从序列开头重新开始,才会出现1,2,1,2...的重复结果。要实现持续获取新值,关键是把迭代器实例保存下来,复用同一个迭代器,而不是每次调用函数都新建。
下面给两种实用的实现方式:
方式一:全局变量保存迭代器(简单场景适用)
先提前创建好迭代器并持久化,之后每次从这个迭代器里取新值:
// 提前初始化并保存迭代器实例 final _funThingsIterator = generateFunThings().iterator; // 封装一个取值方法,每次调用都复用同一个迭代器 String? getNextFunThing() { if (_funThingsIterator.moveNext()) { return _funThingsIterator.current; } return null; // 迭代完可以返回null或自定义默认值 } // 原生成器函数保持不变 Iterable<String> generateFunThings() sync* { yield '1'; yield '2'; yield '3'; yield '4'; }
之后每次调用getNextFunThing(),就会依次拿到1、2、3、4,不会重复。
方式二:类成员变量保存(面向场景更规范)
如果不想用全局变量,比如在业务类里管理,可以把迭代器作为类的私有成员:
class FunThingHandler { late final Iterator<String> _iterator; FunThingHandler() { // 初始化时创建一次迭代器 _iterator = generateFunThings().iterator; } // 对外提供取值方法 String? fetchNext() { if (_iterator.moveNext()) { return _iterator.current; } return null; } } // 原生成器函数不变 Iterable<String> generateFunThings() sync* { yield '1'; yield '2'; yield '3'; yield '4'; }
使用时只需要实例化一次FunThingHandler,反复调用fetchNext()即可获取连续的新值。
补充说明
你之前的写法之所以失效,是因为generateFunThings()每次被调用都会返回一个全新的Iterable对象,调用它的iterator方法自然也会生成新的迭代器,相当于每次都重新遍历整个序列的开头,所以才会重复输出1、2。
内容的提问来源于stack exchange,提问作者Hovestar
相关产品推荐
相关产品推荐

