迭代器当前为空,但为什么呢?

Amc*_*tty 2 iterator dart flutter

我想要获得的是一种通过预定义的步骤顺序生成小部件的方法:小部件1 - >小部件2 - >小部件3 - >完成。我想到制作一个小部件列表,以及“前进”到下一个小部件的方法是调用moveNext()迭代器。但显然我错过了一些东西:

根据此处的文档,如果在迭代器上调用 moveNext() 并返回 true,则之后iterator.current将不为 null。打印时print(hasAdvanced)返回true, soiterator.current不应为空。但它是。为什么它是空的?我缺少什么?

import 'package:flutter/material.dart';

class CreatePageWidget extends StatefulWidget {
  @override
  _CreatePageState createState() => _CreatePageState();
}

class _CreatePageState extends State<CreatePageWidget> {
  List<Widget> sequence = [Text("one"), Text("two")];

  @override
  void initState() {
    super.initState();

    bool hasAdvanced = sequence.iterator.moveNext();
    print(hasAdvanced);
    print(sequence.iterator.current);
  }

  @override
  Widget build(BuildContext context) => sequence.iterator.current;
}
Run Code Online (Sandbox Code Playgroud)

jam*_*lin 5

你有:

 bool hasAdvanced = sequence.iterator.moveNext();
 print(hasAdvanced);
 print(sequence.iterator.current);
Run Code Online (Sandbox Code Playgroud)

您调用sequence.iterator 两次,但Iterable.iterator总是返回一个新的迭代器。从文档中:

返回一个Iterator允许迭代 this 元素的new Iterable

...

每次iterator读取时,它都会返回一个新的迭代器,可用于再次迭代所有元素。同一可迭代对象的迭代器可以独立地单步执行,......

因此,即使您最初成功地推进了,您随后也会从另一个尚未推进的值Iterator检索值,因此仍然未初始化。您可以通过简单地保留对单个 的引用来解决此问题:current IteratorIterator

var iterator = sequence.iterator;
bool hasAdvanced = iterator.moveNext();
print(hasAdvanced);
print(iterator.current);
Run Code Online (Sandbox Code Playgroud)

(我个人认为属性/getter 返回新实例是令人困惑和糟糕的风格,并且这作为显式函数调用会更加明显。不过,现在更改 API 可能不值得这么麻烦。)