Флаттер: общие настройки не синхронизированы в разных функциях

#flutter #sharedpreferences

Вопрос:

Я новичок в разработке Flutter / мобильных устройств и использую пакет shared_preferences в своем приложении вместе с android_alarm_manager_plus. Моя проблема в том, что разные функции сообщают о разных состояниях общих предпочтений и, следовательно, не могут сотрудничать должным образом.

Приложение позволяет пользователям выполнять определенные задачи с определенной периодичностью (ежедневно, еженедельно, …). Пользователи могут выбирать время суток (например, 11 утра), когда они хотят, чтобы им напоминали о текущих задачах. Значение AndroidAlarmManager.periodic с длительностью 24 часа устанавливается в это время суток и вызывает schedule() функцию. schedule() Функция проверяет, пришло ли время снова планировать и какие из задач должны быть выполнены, затем добавляет задачи из списка задач, которые используются в качестве основы для виджета задач для их обслуживания. Когда задача выполнена, она удаляется из этого списка.

Для этого в общих настройках используется несколько значений:

  • dateOfLastScheduling : выполнено планирование на последний день (используется для предотвращения планирования несколько раз в день)
  • last_time_<Task> для каждой задачи приложение знает: в последний день задача была выполнена
  • scheduledTasks : список текущих задач, которые необходимо выполнить

Мои общие предпочтения-это одна переменная в файле с именем storage.dart (обработка сохраняемости в целом), которая инициализируется на первой/целевой странице приложения initState() , например:

 SharedPreferences.getInstance().then((loadedPrefs) async {
      storage.sharedPrefs = loadedPrefs;
      ...
 

Всякий раз, когда я читаю или записываю эти настройки в любой из своих файлов, я использую storage.SharedPrefs. Я делаю это, потому что я читал здесь, что иметь общие предпочтения в качестве «синглтона», подобного этому, предпочтительнее, чем загружать их локально везде, что я делал раньше с теми же проблемами.

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

Тестовая печать общих настроек с помощью этой кнопки регулярно дает результаты, отличные от результатов печати в schedule() функции. Кроме того, когда я изменяю, например, дату последнего планирования здесь, функция не будет иметь этих изменений, вместо этого она будет работать со старой версией общих настроек и, следовательно, не будет планировать. Когда он выполняет планирование, задачи добавляются в scheduledTasks локальную печать , но эти изменения, в свою очередь, больше нигде не отражаются, и виджет, обслуживающий задачи, также не знает об этом. Иногда нажатие кнопки печати несколько раз в конечном итоге приводит к обновлению.

Похоже, что каждая функция использует свою собственную (кэшированную?) версия общих предпочтений, которая является своего рода противоположностью общим. Даже storage.sharedPrefs.reload() то, что вы делаете, на самом деле, кажется, ничего не меняет.

Я упускаю здесь что-то очевидное? Как мне использовать общие настройки, чтобы они были одинаковыми везде и обновлялись немедленно?

Комментарии:

1. Может ли быть частью проблемы AndroidAlarmManager.periodic, работающий в отдельном изолированном режиме? Являются ли общие префы общими для изолятов?