我正在使用一个FutureBuilder
,它的ListView.builder
itemCount
为 3,因此它将显示三个OutlineButton
,它们携带我通过Future<List<int>>
检索的 FirestoreString
。该列表基本上有三个随机生成的整数,但满足某些条件。值很好。
return FutureBuilder(
future: getAllWords(args.collectionId),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: 3,
itemBuilder: (context, index) {
//Future that returns a list of 3 integers
getRestRandom(args.collectionId).then(handler);
int handler(picked){
return picked;
}
return ButtonBar(
children: <Widget>[
OutlineButton(
child: Text(snapshot
.data[picked] // 1st, 2nd, and 3rd value from List
.data["tagalog"]),
onPressed: checkCorrect
? () {
setState(() {
});
}
: () {
print("FALSE");
})
],
);
});
});
该行getRestRandom(args.collectionId).then(handler);
返回一个错误,指出"在声明局部变量'处理程序'之前无法引用它。
将清单输入OutlineButton
文本的最佳方法是什么?
与其使用then
等待getRestRandom()
,不如使用嵌套FutureBuilder
等待列表生成,然后使用它来填充您的ListView
:
return FutureBuilder(
future: getAllWords(args.collectionId),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
return FutureBuilder<List<int>>(
future: getRestRandom(args.collectionId),
builder: (context, numbersSnapshot){
if (!numbersSnapshot.hasData) {
return CircularProgressIndicator();
}
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: 3,
itemBuilder: (context, index) {
return ButtonBar(
children: <Widget>[
OutlineButton(
child: Text(snapshot
.data[numbersSnapshot.data[index]] // 1st, 2nd, and 3rd value from List
.data["tagalog"]),
onPressed: checkCorrect
? () {
setState(() {
});
}
: () {
print("FALSE");
})
],
);
});
}
);
});