Flutter - Dart - setState 在与 Future<> 一起用于异步功能时不会重新加载状态
Flutter - Dart - setState does not reload state when using with Future<> for the async function
我有一个用于 RaisedButton 的带有 setState() 的 Flutter 代码,可以很好地更改所有局部变量,例如更改按钮颜色,hide/show 同一页面上的其他组件等。但是当我使用 Future statusCode = myFun(); where myFun() is Async function, Future always returns setState() 正确的代码每 2 次生效时间.
我的代码在这里:
return RaisedButton(
color: infBtnColor ? Colors.green : Colors.grey,
textColor: Colors.black87,
onPressed: () {
setState(() {
infBtnColor = true; //this takes effect on click properly -always
Future<int> statusCode = myFun(false);
statusCode.then((value) {
if (value == 200) {
ESPSyncIconColor = true; // this is to modify other icon from the AppBar
print("Btn GREEN");
}
else {
ESPSyncIconColor = false;
print("RED");
}
});
});
}
);
应用程序条码在这里:
AppBar(
title: Text(title,style: TextStyle(fontSize:18,fontWeight: FontWeight.w300,)),
backgroundColor: new Color(0xff303030),
actions: <Widget>[
Padding(
padding: EdgeInsets.only(right: 25.0),
child: Row(
children: <Widget>[
Icon(Icons.cloud_upload,size: 26,
color: (**ESPSyncIconColor**)?Colors.green:Colors.red,
),],),),
],),
这里我使用变量 ESPSyncIconColor 从同一页面的 AppBar 更新图标颜色。第二次总是工作,那也是以前的状态。
不要将 setState 与 Future 函数一起使用。设置未来执行后的状态。等待并稍后使用 setState()。
onPressed: () {
infBtnColor = true; //this takes effect on click properly -always
Future<int> statusCode = myFun(false);
await statusCode.then((value) {
if (value == 200) {
ESPSyncIconColor = true; // this is to modify other icon from the AppBar
print("Btn GREEN");
}
else {
ESPSyncIconColor = false;
print("RED");
}
});
setState((){
});
}
您必须再次调用 setState
才能更改其他变量:
myFun(false).then((value) => setState(() => ESPSyncIconColor = value == 200));
您正在调用 setState
中的未来。这个未来不会完成,直到 setState
returns 和小部件被重建。相反,await
或 then
未来,然后调用 setState
。
onPressed: () {
infBtnColor = true;
myFun(false).then((value) {
setState(() {
if (value == 200) {
ESPSyncIconColor = true; // this is to modify other icon from the AppBar
print("Btn GREEN");
} else {
ESPSyncIconColor = false;
print("RED");
}
});
});
}
以上所有答案都帮助我解决了这个问题:
我修改后的代码在这里,以防其他人遇到这个问题。
Future<int> statusCode = myFun(true);
statusCode.then((int value) {
setState(() {
if (value == 200) {
ESPSyncIconColor = true;
print("Time Btn GREEN");
}
else {
ESPSyncIconColor = false;
print("Time Btn RED");
}
print(value);
});
我有一个用于 RaisedButton 的带有 setState() 的 Flutter 代码,可以很好地更改所有局部变量,例如更改按钮颜色,hide/show 同一页面上的其他组件等。但是当我使用 Future statusCode = myFun(); where myFun() is Async function, Future always returns setState() 正确的代码每 2 次生效时间.
我的代码在这里:
return RaisedButton(
color: infBtnColor ? Colors.green : Colors.grey,
textColor: Colors.black87,
onPressed: () {
setState(() {
infBtnColor = true; //this takes effect on click properly -always
Future<int> statusCode = myFun(false);
statusCode.then((value) {
if (value == 200) {
ESPSyncIconColor = true; // this is to modify other icon from the AppBar
print("Btn GREEN");
}
else {
ESPSyncIconColor = false;
print("RED");
}
});
});
}
);
应用程序条码在这里:
AppBar(
title: Text(title,style: TextStyle(fontSize:18,fontWeight: FontWeight.w300,)),
backgroundColor: new Color(0xff303030),
actions: <Widget>[
Padding(
padding: EdgeInsets.only(right: 25.0),
child: Row(
children: <Widget>[
Icon(Icons.cloud_upload,size: 26,
color: (**ESPSyncIconColor**)?Colors.green:Colors.red,
),],),),
],),
这里我使用变量 ESPSyncIconColor 从同一页面的 AppBar 更新图标颜色。第二次总是工作,那也是以前的状态。
不要将 setState 与 Future 函数一起使用。设置未来执行后的状态。等待并稍后使用 setState()。
onPressed: () {
infBtnColor = true; //this takes effect on click properly -always
Future<int> statusCode = myFun(false);
await statusCode.then((value) {
if (value == 200) {
ESPSyncIconColor = true; // this is to modify other icon from the AppBar
print("Btn GREEN");
}
else {
ESPSyncIconColor = false;
print("RED");
}
});
setState((){
});
}
您必须再次调用 setState
才能更改其他变量:
myFun(false).then((value) => setState(() => ESPSyncIconColor = value == 200));
您正在调用 setState
中的未来。这个未来不会完成,直到 setState
returns 和小部件被重建。相反,await
或 then
未来,然后调用 setState
。
onPressed: () {
infBtnColor = true;
myFun(false).then((value) {
setState(() {
if (value == 200) {
ESPSyncIconColor = true; // this is to modify other icon from the AppBar
print("Btn GREEN");
} else {
ESPSyncIconColor = false;
print("RED");
}
});
});
}
以上所有答案都帮助我解决了这个问题:
我修改后的代码在这里,以防其他人遇到这个问题。
Future<int> statusCode = myFun(true);
statusCode.then((int value) {
setState(() {
if (value == 200) {
ESPSyncIconColor = true;
print("Time Btn GREEN");
}
else {
ESPSyncIconColor = false;
print("Time Btn RED");
}
print(value);
});