본문 바로가기

Flutter

[Flutter] SharedPreferences를 통한 상태 관리

기기 자체에 데이터를 저장하는 SharedPreferences

Flutter에서 SharedPreferences는 기기 자체에 앱의 데이터를 저장하는 기능을 구현하려는 경우에 사용하는 라이브러리입니다. 일반적으로는 앱의 환경설정 값을 구현하기 위해 사용합니다.

SharedPreferences에 저장된 데이터들은 key-value 형태로 저장됩니다. key는 반드시 문자열 형태를 가지며, set 혹은 get 메소드를 사용하여 각 key에 해당하는 value를 저장하거나 불러올 수 있습니다.

저장 혹은 불러오려는 데이터에 대한 set과 get 메소드는 해당 데이터를 담은 변수의 데이터 타입을 따릅니다. getString(), getBool(), getInt()... 과 같은 형태로 작성합니다.

 

SharedPreferences 의 장점

앱의 환경설정 정보와 같은 상태 관리를 구현할 수 있습니다. 이를테면 사용자가 앱을 종료하고 다시 실행해도 이전에 설정한 값들을 불러와서 화면에 표시한다거나, 사용자가 설정값을 변경했을 때 새로 업데이트된 값들을 디바이스가 자체적으로 기억하고 앱으로 불러오게끔 만들 수 있습니다.

SharedPreferences는 앱 전역에서 공유되는 데이터 저장소이기 때문에, A 클래스에서 set 메소드를 통해 저장한 전역 변수를 B나 C 클래스와 같은 외부 클래스에서도 get 메소드를 통해 불러올 수 있습니다.

 

SharedPreferences 의 단점

SharedPreferences는 환경설정과 같이 한 번만 불러온 뒤에 다시 호출되지 않는 전역 변수들을 관리할 때에 적합합니다. 모든 전역 변수에 대해서 SharedPreferences로 관리한다면 앱의 성능을 다소 떨어뜨릴 수가 있습니다.

때문에 그 외의 전역 변수 상태 관리에 대해서는 Provider를 섞어서 사용하는 것이 적절한 판단입니다.

 

사용 예시

 

shared_preferences | Flutter Package

Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android.

pub.dev

먼저 pub.dev의 SharedPreferences 패키지를 로컬 프로젝트 pubspec.yaml 파일의 dependencies에 추가합니다.

dependencies:
  shared_preferences: ^2.2.0

이후 AndroidStudio 상단에 나타나는 pub get을 클릭하여 pubspec.yaml 파일에 추가한 내용을 다운로드합니다.

pub 업데이트가 완료되면 이제 dart 파일에서 해당 라이브러리를 import하여 사용할 수 있게 됩니다.

import 'package:shared_preferences/shared_preferences.dart';

 

A 클래스에서 문자열 변수 `pizza`를 SharedPreferences에 `pizzaTime`이라는 key로 저장(set)하여 전역변수 처리

String pizza = "OMG";
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('pizzaTime', pizza);

A클래스에서 전역변수 처리한 `pizza` 변수를 `pizzaTime` key를 통해 B 클래스에서 로드(get)

SharedPreferences prefs = await SharedPreferences.getInstance();
String pizza = prefs.getString('pizzaTime') ?? 'or burger'; // Nullable
print(pizza); // "OMG" (만약 'pizzaTime'에 저장된 값이 없을 경우 "or burger"가 출력됨)

그 외의 클래스에서도 위와 동일한 방식으로 'pizzaTime' key를 통해 pizza 변수를 로드할 수 있습니다.

이처럼 SharedPreferences를 이용하여 앱 내에서 설정한 값들을 효율적으로 관리하고, 여러 클래스에서 동일한 key를 사용하여 데이터를 앱 전역에서 공유할 수 있습니다. 이를 통해 앱의 설정 정보나 상태를 유지하고, 다양한 클래스에서 해당 정보를 사용할 수 있습니다.