Dart 扑动未来与设定状态
当我得到API调用的结果时,我试图添加一个图像小部件。我的代码是:Dart 扑动未来与设定状态,dart,flutter,Dart,Flutter,当我得到API调用的结果时,我试图添加一个图像小部件。我的代码是: class AnimalDetailsPage extends StatefulWidget { final selection; _AnimalDetailsPage createState() => new _AnimalDetailsPage(); AnimalDetailsPage({Key key, this.selection}) : super(key: key); } class _Anim
class AnimalDetailsPage extends StatefulWidget {
final selection;
_AnimalDetailsPage createState() => new _AnimalDetailsPage();
AnimalDetailsPage({Key key, this.selection}) : super(key: key);
}
class _AnimalDetailsPage extends State<AnimalDetailsPage> {
Future<List> getphotos(horseId) async {
http.Response response = await http.get(
Uri.encodeFull(
"http://myhorses.com/api/getHorsePhotos?horse_id=" +
horseId));
return JSON.decode(response.body);
}
@override
Widget build(BuildContext context) {
final menu = new MyMenuBar();
List<Widget> bodyContent = [menu];
dynamic body = new Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: bodyContent,
);
if (widget.selection != null) {
final horse = widget.selection;
getphotos(horse['id'].toString()).then((res) {
setState(() {
bodyContent.add(new Image.network(res[0]['image']));
});
});
}
return Scaffold(
body: body,
);
}
}
class AnimalDetailsPage扩展了StatefulWidget{
最终选择;
_AnimalDetailsPage createState()=>新建;
动物细节({Key,this.selection}):超级(Key:Key);
}
类_AnimalDetailsPage扩展状态{
未来getphotos(horseId)异步{
http.Response-Response=等待http.get(
Uri.encodeFull(
"http://myhorses.com/api/getHorsePhotos?horse_id=" +
霍赛德);
返回JSON.decode(response.body);
}
@凌驾
小部件构建(构建上下文){
最终菜单=新建MyMenuBar();
列表bodyContent=[菜单];
动态主体=新列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:身体内容,
);
if(widget.selection!=null){
最终马=小部件。选择;
getphotos(horse['id'].toString())。然后((res){
设置状态(){
添加(新的Image.network(res[0]['Image']);
});
});
}
返回脚手架(
身体:身体,,
);
}
}
我无法理解的是setState不会更新视图。如果我将setState移出then语句并硬编码图像src,那么它工作正常。
bodyContent
在build()中声明。
@覆盖
小部件构建(构建上下文){
最终菜单=新建MyMenuBar();
列表bodyContent=[菜单];
...
添加(新的Image.network(res[0]['Image']);
...
而setState()
导致再次执行build
,这意味着保存图像的bodyContent
将被丢弃,而新创建的图像将被丢弃
将
List bodyContent=[menu];
移出build()
方法,将其设置为类级字段,您应该会得到所需的结果。非常感谢Gunter!
@override
Widget build(BuildContext context) {
final menu = new MyMenuBar();
List<Widget> bodyContent = [menu];
...
bodyContent.add(new Image.network(res[0]['image']));
...