Трепетание, функция должна ждать, пока данные не будут доступны - PullRequest
0 голосов
/ 13 января 2019

Я новичок в программировании флаттера. Я пытаюсь понять вызовы асинхронных функций, но сбился с пути.

Я хочу хранить данные на своем устройстве защищенным способом. Таким образом, при записи данных данные будут зашифрованы, а при чтении данных данные будут расшифрованы. Приложение не знает, что данные зашифрованы на устройстве.

Я создал класс Storage, который использует библиотеку SharedPreferences.

Вторая функция функции чтения заключается в том, что приложение будет ждать, пока данные не станут доступны.

Я написал что-то вроде этого

  static String getString(String key)  {
SharedPreferences prefs = await SharedPreferences.getInstance();

return _decrypt(prefs.getString(key));   

}

Теперь компилятор жалуется, что оператор await не ожидается.

Когда я изменяю функцию на асинхронную функцию и возвращаю будущее, это работает. Однако моя проблема ожидания поднимается до места, где вызывается функция getString.

Цель: функция должна возвращать расшифрованную строку, и основной поток должен ждать, пока данные не станут доступны.

Любая помощь приветствуется

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Вы никогда не должны блокировать основной поток, потому что он блокирует операции приложения. Ваша инициализация может занять много времени, и система может убить ваши приложения в случае необходимости.

Чтобы решить вашу проблему, лучше не блокировать основной поток, это можно сделать, создав экран загрузки, дождавшись завершения загрузки данных и отобразив экран окончательного приложения.

Прототип кода может выглядеть следующим образом:

class HomePage extends StatefulWidget {
  @override
  HomePageState createState() => HomePageState();
}

class HomePageState extends State<HomePage> {
  String data;

  @override
  void initState() {
    super.initState();

    loadData().then((data) {
      setState(() {
        this.data = data; 
      });
    });
  }

  Future loadData() async {    
    data = 'xxx'; // load your data from SharedPreferences
    return data;    
  }

  @override
  Widget build(BuildContext context) {
    if (data == null) {
      loadData();
      return LoadingScreen();
    } else {
      return MainScreen();
    }
  }
}
0 голосов
/ 13 января 2019

Извините, что не достаточно конкретен. Моя страница загружается в своей собственной теме. В потоке я хочу получить значение из магазина. Поток не может быть продолжен, поскольку следующий оператор зависит от данных из хранилища.

например. Мне нужно имя пользователя и пароль из магазина, чтобы иметь возможность войти. имя пользователя и пароль хранятся отдельно.

Конечно, я могу вкладывать операторы then, но я думаю, что для удобочитаемости исходного кода лучше подождать, пока значение не будет считано из хранилища.

0 голосов
/ 13 января 2019

Вы должны добавить ключевые слова async и Future следующим образом:

static Future<String> getString(String key)  async { // ------> here
   SharedPreferences prefs = await SharedPreferences.getInstance();

   return _decrypt(prefs.getString(key));   
}

и чтобы использовать этот асинхронный метод, вы должны сделать это следующим образом:

getString("someKey").then((valueString) => print(valueString));
...