我必须根据两组不同的文章来更新查询。内部的构建器使用两个不同的快照值。 ArticleFragmentWidget查询其他文章详细信息。它应该获得与上面的文本小部件相同的ID,但事实并非如此。
Text(snapshot.data.articleIds[index].toString()),
ArticleFragmentWidget(snapshot.data.articleIds[index])
这两行在相同的上下文中站在一起,应该获得相同的ID,但事实并非如此。
无论如何,如果我将语句扩展到
if (snapshot.hasData && snapshot.connectionState == ConnectionState.done)
它们都获得相同的值。但为什么? 在另一个示例中,我使用TextEditingControllers侦听器更新Future,并且按预期方式工作。
代码如下:
class ArticleSearchSimpleState extends State<ArticleSearchSimple> {
String _search;
bool _onStockOnly;
Future<ArticleIdList> _articleIds;
ArticleSearchSimpleState(this._search) {
_articleIds = Request().queryArticleSearch(_search);
}
void _onStockOnlyChanged(bool value) {
setState(() {
_onStockOnly = value;
_articleIds = Request().queryArticleSearch(_search, onStockOnly: value);
});
}
@override
Widget build(BuildContext context) {
return ListView(
physics: ClampingScrollPhysics(),
shrinkWrap: true,
children: <Widget>[
Row(
children: <Widget>[
Radio(
value: false,
groupValue: _onStockOnly,
onChanged: _onStockOnlyChanged),
Text('Alle Artikel'),
Spacer(),
Radio(
value: true,
groupValue: _onStockOnly,
onChanged: _onStockOnlyChanged),
Text('Lagerartikel')
],
),
FutureBuilder<ArticleIdList>(
future: this._articleIds,
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.separated(
separatorBuilder: (ctx, index) => const Divider(height: 1),
shrinkWrap: true,
physics: ClampingScrollPhysics(),
itemCount: snapshot.data.articleIds.length,
itemBuilder: (context, index) {
return Column(
children: <Widget>[
Text(snapshot.data.articleIds[index].toString()),
ArticleFragmentWidget(snapshot.data.articleIds[index])
],
);
});
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
return Center(child: CircularProgressIndicator());
}),
],
);
}
}