[Flutter] state 말고 shared preferences

멋진감자·2025년 7월 23일
0

Flutter

목록 보기
20/25
post-thumbnail

state에 저장한 데이터는 앱 재가동시 휘발된다.
데이터를 저장하기 위한 방법 중 shared preferences 사용법을 배워보자.

0. 데이터 보존 방법

  1. 서버로 보내서 DB에 저장 - 중요한 데이터
  2. 폰 메모리카드에 저장 - 들 중요한 데이터
    요게 shared preferences를 활용하는 방법이다.
    유저가 직접 삭제하지 않는 이상 반영구적으로 남아있게 됨

1. shared preferences

설치

// pubspec.yaml
dependencies:
  shared_preferences: ^2.5.3

// main.dart
import 'dart:convert'; // <- jsonDecode 함수 쓸 때 필요
import 'package:shared_preferences/shared_preferences.dart';

pub get 후에는 앱(emulator)을 종료하고 다시 시작해주자

사용법

데이터 저장

저장할 땐 storage.setString('데이터이름', 저장할데이터)
그니까 key하고 value 형태로 쓰면 됨

saveData() async {
  var storage = await SharedPreferences.getInstance();
  storage.setString('name', 'John');
}

데이터 출력

출력할 땐 storage.getString('데이터이름')

saveData() async {
  var storage = await SharedPreferences.getInstance();
  storage.setString('name', 'John');
  var result = storage.getString('name');
  print(result); // John
}

데이터 삭제

삭제할 땐 storage.remove('데이터이름')

함수

데이터 저장 함수

  • setString('name', 'John')
  • setBool('bool', true)
  • setInt('int', 1)
  • setDouble('double', 2.5)
  • setStringList('stringList', ['John1', 'John2'])

map 자료형은 jsonEncode + setString 조합 활용
map에 전부 따옴표 붙여서 JSON으로 가라쳐줌

var storage = await SharedPreferences.getInstance();
var map = {'count': 3};
storage.setString('map', jsonEncode(map));

데이터 호출 함수

  • getString('name')
  • getBool('bool')
  • getInt('int')
  • getDouble('double')
  • getStringList('stringList')

아까 저장한 map을 일단 갖고와보자

var result = storage.getString('map');
print(result); // {'count': 3}

근데 이거는 꺼내쓰기 어려운(result['count']: 에러) 형태라
jsonDecode 함수가 필요하다.

print(jsonDecode(result)); // Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.

그냥 getString 말고 .get('key')도 먹는데 꺼내보면 Object? 요런식의 타입으로 끄내짐. .getString('key')로 꺼내면 String? 이렇게 타입을 좀 더 명확하게 저장할 수 있다.

다시 돌아가서 String인지 null인지 확실히 않아 뜨는 에러를 해결하기 위해 ?? 써서 null check 해주기.

var result = storage.getString('map') ?? '없어';
print(jsonDecode(result)); // {count: 3}
print(jsonDecode(result)['count']); // 3

활용

  • 기존에 state로 관리했던 데이터를 shared preferences에 넣어두고,
    앱을 켤 때 갖고오는 식으로 관리하면 로드 속도가 빨라지고 2 서버와 주고받는 데이터 양도 줄일 수 있다.
  • 근데 shared preferences에는 문자만 저장 가능하므로 이미지를 저장하고 싶을 땐 network 이미지를 폰에 몰래 저장해주는 패키지 cached_network_image를 써보자.
    매번 다운받는 게 아니라 필요할 때 폰에서 가져와주니 더 빠르다.
profile
난멋져

0개의 댓글