in C#, Daj Się Poznać 2017

Przechowywanie ustawień aplikacji w Xamarin.Forms #dsp2017

Przeglądam aktualnie potencjalne rozwiązania przechowywania ustawień aplikacji takich jak wybrany motyw kolorystyczny, częstotliwość powiadamiania użytkownika, język czy ustawienia pokazywania treści NSFW. Do tej pory trafiłem na trzy sposoby przechowywania takich danych:

  • właściwości aplikacji (a persistent properties dictionary) – do przechowywania trywialnych, kwantowalnych informacji, dostępne z każdego miejsca w aplikacji
  • system plików aplikacji – np. jako pliki JSON, które wymagają (de)serializacji przy zmianie stanu aplikacji
  • baza danych SQLite – nieco jak strzelanie z armaty do muchy, ale na pewno wykorzystam w późniejszym etapie projektu

W przypadku mojej prostej aplikacji najrozsądniejsze wydaje się użycie pierwszej metody. Dane nie będą zbyt skomplikowane – w praktyce ograniczają się do kilku booli i id języka. Dlatego też przejrzałem sieć* w poszukiwaniu przykładów i doszedłem do poniższego bardzo prostego rozwiązania.

W pliku App.xaml.cs  stworzyłem na początek kilka podstawowych właściwości:

public partial class App : Application
  {
      private const string LocaleKey = "Locale";
      private const string NotificationsEnabledKey = "NotificationsEnabled";

        public App ()
    {
      MainPage = new KiedySerial.Views.MainPage();
    }

      public string Locale
      {
          get
          {
              if (Properties.ContainsKey(LocaleKey))
                  return Properties[LocaleKey].ToString();
              return "en_US";
          }
          set
          {
                Properties[LocaleKey] = value;
          }
      }

      public bool NotificationsEnabled
      {
          get
          {
              if (Properties.ContainsKey(NotificationsEnabledKey))
                  return (bool) Properties[NotificationsEnabledKey];
                return false;
          }
          set
          {
                Properties[NotificationsEnabledKey] = value;
          }
      }
    }

Dzięki temu odwołując się w dowolnym miejscu programu do którejś z powyższych właściwości mogę kontrolować zachowanie aplikacji. Co najfajniejsze mogę również zbindować je w widoku Settings.xaml do konkretnych kontrolek pamiętając oczywiście o odpowiednim kontekście bindowania.

<SwitchCell Text="Notifications" On="{Binding NotificationsEnabled}"/>

Nie wiem jeszcze, czy jest to ostateczne rozwiązanie, ponieważ zastanawiam się nad stworzeniem oddzielnej klasy Settings, która zajmowałaby się całą logiką tego procesu. Możliwe, że zgodnie z dobrymi praktykami można by wykorzystać ViewModel do połączenia kontrolek z magazynem ustawień. Najpewniej z czasem zmienię wybrany przez siebie sposób przechowywania tych danych na inny, więc takie rozwiązanie wydaje się sensowne.

Drogi Czytelniku! Jeśli interesuje cię temat Xamarin.Forms albo masz doświadczenia z takimi zagadnieniami w C#, to będę wdzięczny za porady, jak rozwiązać ten element aplikacji.

* – znalazłem na GitHubie ciekawą paczkę NuGeta SettingsPlugin, która automatyzuje zarządzenie ustawieniami na wielu platformach. Mam w planie sprawdzić jej działanie i wtedy podzielę się wrażeniami.