기본적으로 SharedPreference만 가지고서는 객체를 저장할 수 없다.
SharedPreference는 원시 자료형만 지원하기 때문이다.
하지만 객체를 json형태로 변환하면 String에 속하게 되므로, SharedPreference에 적용할 수 있다.
예시 코드로 보여주자면
모델을 먼저 만들고
class User {
String Firebase_UID;
String FCM_TOKEN;
List<String> SubscriptionList = [];
User(this.Firebase_UID, this.FCM_TOKEN);
User.fromJson(Map<String, dynamic> json)
: Firebase_UID = json['Firebase_UID'],
FCM_TOKEN = json['FCM_TOKEN'],
SubscriptionList = json['SubscriptionList'].cast<String>();
Map<String, dynamic> toJson() => {
'Firebase_UID': Firebase_UID,
'FCM_TOKEN': FCM_TOKEN,
'SubscriptionList': SubscriptionList,
};
}
얻어올 땐
Future<void> getUser() async {
SharedPreferences shared_User = await SharedPreferences.getInstance();
String? u = shared_User.getString('user');
if(u == null) {
in_User = User('tmp', 'tmp'); // 임시값
} else {
var userMap = jsonDecode(u);
in_User = User.fromJson(userMap);
}
return;
}
// in_User는 User 객체이다
저장할 땐
void saveUser() async {
SharedPreferences shared_User = await SharedPreferences.getInstance();
var u = jsonEncode(in_User!.toJson());
shared_User.setString('user', u);
}
// in_User는 User 객체이다
이렇게 간단하게 구현할 수 있다.
jsonEncode와 jsonDecode의 인자로 무엇이 넘겨지는지 잘 확인해보면 좋다!
jsonEncoding의 과정을 간단히 짚고 넘어가자면
객체 -> Map<String, dynamic> -> jsonString
이런식이 된다.
jsonDecoding의 과정을 이번엔 코드와 함께 보자면
jsonString -> Map<String, dynamic> -> 객체
var jsonString = ‘{“name”: “John Smith”,”email”: “john@example.com”}’;
Map<String, dynamic> user = jsonDecode(jsonString);
User u = User.fromJson(user)
이렇게 된다.
이런 전체적인 과정을 직렬화라고 한다.
직렬화 : 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터를 변환하는 기술
참고
Store data as an object in shared preferences in flutter
I want to store an object in shared preferences which contains some fields in it like name, age, phone number etc. I don't know how to store an object in shared preferences in flutter.
stackoverflow.com
JSON
https://medium.com/@thecodingpapa/json-flutter-61815c214eb8
JSON - Flutter
Flutter 개발시 JSON데이타를 다루는 법을 배워보자! 어플리케이션 개발시 네트워크 커뮤니케이션이 있다면 JSON을 쓸 가능성이 아주 많다.
medium.com
'[클라이언트] > [Flutter]' 카테고리의 다른 글
Flutter 네트워크 이미지 캐싱 (0) | 2022.11.12 |
---|---|
Flutter base64Encoding (0) | 2022.11.10 |
[Flutter] GridView bottom overflow 대응 (0) | 2022.11.03 |
[Flutter] ReorderableListView (ListView drag / drag ListView) (0) | 2022.10.31 |
[Flutter] Firebase FCM 노티피케이션이 도착하지 않는다면 (0) | 2022.10.28 |