기기 자체에 데이터를 저장하는 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를 사용하여 데이터를 앱 전역에서 공유할 수 있습니다. 이를 통해 앱의 설정 정보나 상태를 유지하고, 다양한 클래스에서 해당 정보를 사용할 수 있습니다.