при использовании setState () появляется аргумент обратного вызова setState () - PullRequest
0 голосов
/ 09 июля 2019

когда я использую setState (), текст появляется в консоли отладки ..

Аргумент обратного вызова setState () вернул Future. Метод setState () в _LoginActivityState # 9cd91 был вызван с замыканием или методом, который возвратил 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);
  }
}

}

1 Ответ

0 голосов
/ 09 июля 2019

setState () следует использовать только для установки нового состояния виджета с состоянием. Вы не должны выполнять асинхронные операции в нем, и вы не должны ничего возвращать из него. Я предполагаю, что «accessToken» - это поле, состояние которого вы меняете, поэтому будет лучше выполнить все остальные операции вне setState () и просто оставить 'accessToken = response['token'];' внутри.

...