Flutter shared_preferences

이건선·2023년 7월 27일
0

Flutter

목록 보기
21/30

firebase

  • 저장 코드
  1. api.addAddressBookItem 메서드를 통해서 특정 collection에 저장

  2. return값을 then메서드를 통해서 addressBookList에 끼워 넣고 있다.

        ```dart
        // 2. wallet.addAddressBook(result);
        
        RxList<AddressBookModel>  addressBookList = <AddressBookModel>[].obs;
        
        ...
        addAddressBook(AddressBookModel addItem) {
            for (var item in addressBookList) {
              if (item.id == addItem.id) { // id는 파이어베이스의 ref.doc().id;
                addressBookList[addressBookList.indexOf(item)] = addItem;
                return;
              }
            }
            addressBookList.insert(0, addItem);
          }
        ```
        
    confirmNewAddress() {
    ...
        var itemInfo = AddressBookModel.fromJson(editItem!.toJson());
    ...
        api.addAddressBookItem(itemInfo).then((result) {
          if (result != null) {
            ShowToast('address book add success'.tr);
            wallet.addAddressBook(result);
    ...
    // 1. api.addAddressBookItem(itemInfo)
    
    final AddressCollection = 'data_address'; // 저장된 위치
    
    Future<AddressBookModel?> addAddressBookItem(AddressBookModel addItem) async {
        var ref = firestore!.collection(AddressCollection); 
    ...
          await ref.doc(addItem.id).set(result); // 데이터 저장
          result = FROM_SERVER_DATA(result);
    ...
          return AddressBookModel.fromJson(result); // return
    ...
        return null;
      }
  • future
    1. 주소록이 저장 되어있는 firebase collection에서 데이터를 가져온다.

    2. 가져온 데이터를 List<AddressBookModel> result = []; 에 하나씩 변환해서 넣는다.

    3. 완성된 배열을 return한다. 배열을 future의 snapshot으로 감시한다.

      ...
       FutureBuilder(
                   future: controller.getAddressData(),
      ...
      
      Future<List<AddressBookModel>> getAddressData() {
          return api.getAddressBookList(auth.user!.id);
        }
      
      ...
      
      final AddressCollection = 'data_address'; // 저장된 위치
      
        Future<List<AddressBookModel>> getAddressBookList([String? userId]) async {
          List<AddressBookModel> result = [];
          var ref = firestore!.collection(AddressCollection);
      ...
            var snapshot = await ref
                .orderBy('createTime', descending: true)
                .get();
            for (var doc in snapshot.docs) {
              result.add(AddressBookModel.fromJson(FROM_SERVER_DATA(doc.data())));
            }
      ...
          return result;
        }

shared_preferences

  • 데이터를 저장하는 방법 ⇒ 고유한 key에 value를 넣는다.
  • 데이터를 읽어오는 방법 ⇒ 고유한 key값을 이용해서 데이터를 검색한다.

shared_preferences 와 firebase 비교

  • firebase
    • collection만 알고 있다면 모든 데이터를 가져 올 수 있습니다. 그리고 배열에 넣는 가공을 마친뒤에 future를 이용해 snapshot으로 확인 할 수 있습니다.
  • shared_preferences
    • 고유한 key를 사용해서 데이터를 검색하고 가져와야 합니다.

차이에서 오는 문제점

  • 기존 firebase에서는 collection만 알고 있다면 모든 데이터를 다 가져 올 수있다. 하지만 shared_preferences는 key와 value의 매칭이다.

차이점에서 발생하는 문제 해결 생각해보기

  • 방법 1. ⇒ 각각의 고유한 key값들을 순회하면서 value를 가져오고 가져온 value들을 배열에 넣고 감시한다.
  • 방법 2. ⇒ 고유한 하나의 key로 모든 데이터를 리스트로 가져오는 방법

방법 1.

  • index를 어디까지 부여해야할지 알기위해서는 주소록 데이터를 얼만큼 가지고 있는지 알 수 있어야하는데 이를 측정할 수 있는 데이터가 없으므로 index를 키값으로 사용하는 것은 불가능하다.

방법 2.

  • 데이터를 저장하려는 경우 SaveData에서 String으로 분기 되어야 한다.
  • String으로 분기 되지만 future로 활용해야 하기 때문에 return은 List<AddressBookModel>값이 나와야한다.
  • 로직처리는 getStringList,setStringList를 활용해야 한다.
  • 생각해야 하는 것은 List<String> 타입만 저장이 가능하다는 것이다.

방법 2 채택


// 방법 예시

SharedPreferences prefs = await SharedPreferences.getInstance();
List<String>? myList = prefs.getStringList('my_key');
if (myList == null) myList = []; // if the key does not exist yet
myList.add('new_value');
await prefs.setStringList('my_key', myList);
  1. 직렬화를 통해서 String타입으로 변환합니다. 이렇게 함으로써 String 분기를 통과합니다.

  2. getStringList 메서드를 사용하여 특정 키에 저장된 배열을 가져옵니다.

  3. 이 배열에 새로운 요소를 추가하거나 기존 요소를 변경합니다.

  4. setStringList 메서드를 사용하여 변경된 배열을 다시 저장합니다.

  5. 마지막으로 변경된 배열을 역직렬화해서 return 합니다.

profile
멋지게 기록하자

0개의 댓글