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)
你有:
Run Code Online (Sandbox Code Playgroud)bool hasAdvanced = sequence.iterator.moveNext(); print(hasAdvanced); print(sequence.iterator.current);
您调用sequence.iterator 两次,但Iterable.iterator总是返回一个新的迭代器。从文档中:
返回一个
Iterator允许迭代 this 元素的newIterable。...
每次
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 可能不值得这么麻烦。)