11

当我使用 setState () 文本出现在调试控制台中..

setState() 回调参数返回一个 Future。_LoginActivityState#9cd91 上的 setState() 方法是使用返回 Future 的闭包或方法调用的。也许它被标记为“异步”。不是在 setState() 调用中执行异步工作,而是首先执行工作(不更新小部件状态),然后在 setState() 调用中同步更新状态。

   Future<void> login() async {
final formState = formKey.currentState;
if (formState.validate()) {
  formState.save();
  try {
    final response = await UserController.login({
      "username": username,
      "password": password,
    });

    if (response != null && response["success"]) {
      setState(() async {
        accessToken = response['token'];
        //print(token);
        if (accessToken != null) {
          await Http.setAccessToken("Bearer $accessToken");
        }
        print('$accessToken');
        final getMe = await AiframeworkController.getProfile();
        print('data: $getMe');
        if (getMe != null && getMe['is_verified'] == true) {
           return Navigator.pushReplacement(
                context, MaterialPageRoute(builder: (context) => MainActivity()));
        } else {
          return Center(
                child: CircularProgressIndicator(),
              );
        }
      });
    }
  } catch (e) {
    print(e.message);
  }
}

}

4

1 回答 1

11

setState() 应该只用于设置有状态小部件的新状态。您不应该在其中执行异步操作,也不应该从中返回任何内容。我假设“accessToken”是您正在更改其状态的字段,因此最好在 setState() 之外执行所有其他操作并留'accessToken = response['token'];'在里面。

于 2019-07-09T08:18:05.590 回答