api.addAddressBookItem 메서드를 통해서 특정 collection에 저장
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;
}
주소록이 저장 되어있는 firebase collection에서 데이터를 가져온다.
가져온 데이터를 List<AddressBookModel> result = [];
에 하나씩 변환해서 넣는다.
완성된 배열을 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;
}
차이점에서 발생하는 문제 해결 생각해보기
방법 1.
방법 2.
String
으로 분기 되어야 한다.List<AddressBookModel>
값이 나와야한다.getStringList
,setStringList
를 활용해야 한다.List<String>
타입만 저장이 가능하다는 것이다.
// 방법 예시
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);
직렬화를 통해서 String타입으로 변환합니다. 이렇게 함으로써 String 분기를 통과합니다.
getStringList
메서드를 사용하여 특정 키에 저장된 배열을 가져옵니다.
이 배열에 새로운 요소를 추가하거나 기존 요소를 변경합니다.
setStringList
메서드를 사용하여 변경된 배열을 다시 저장합니다.
마지막으로 변경된 배열을 역직렬화해서 return 합니다.