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 和小部件被重建。相反,awaitthen 未来,然后调用 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);
          });