【Flutter】SharedPreferences로 List 데이터를 저장하는 방법 【도해 첨부】
SharedPreferences는 List 형식의 데이터를 저장하려는 경우 String 유형만 저장할 수 있습니다.
모든 유형의 List 데이터를 저장하고 싶다면 한 번 필요합니다.
솔루션: json 형식 활용
json 형식의 인코딩과 디코딩을 통해 실현할 수 있습니다.
내 앱 제작 실천 예보다 전합니다.
Provider의 사용법은 이쪽.
【Flutter】앱 제작에서 배우는 Provider의 사용법 【도해 첨부】
(아래 준비) Map 관련 처리 작성
아래의 ClockModel은
에 대한 아래 준비입니다.
나중에 사용합니다.
clock.dart
class ClockModel {
final String id;
String clock;
int currentSeconds;
int plusSeconds;
bool isMyTurn = false;
Timer timer;
ClockModel(
{this.id,
this.clock,
this.currentSeconds,
this.plusSeconds,
this.isMyTurn,
this.timer});
/// Map型に変換
Map toJson() => {
'id': id,
'clock': clock,
'currentSeconds': currentSeconds,
'plusSeconds': plusSeconds,
'isMyTurn': isMyTurn,
'timer': timer,
};
/// JSONオブジェクトを代入
ClockModel.fromJson(Map json)
: id = json['id'],
clock = json['clock'],
currentSeconds = json['currentSeconds'],
plusSeconds = json['plusSeconds'],
isMyTurn = json['isMyTurn'],
timer = json['timer'];
}
SharedPreferences List 데이터 저장 방법
그림으로 나타내면 보시다시피 (정확하지 않습니다).
※아이콘은, 자 블로그( htps : // 코미라 rch. 이 m )로 사용하고 있는 코알라입니다.
이번에는 ClockModel에 정의한 데이터를 나열한 settingClocks라는 객체가 저장하고 싶은 데이터입니다.
clock.dart
class ClockProvider with ChangeNotifier {
// 今回保存したいリスト
List<ClockModel> settingClocks = [];
ClockProvider() {
syncDataWithProvider();
}
void initSettingClocks() {
settingClocks = [
ClockModel(
id: '1',
clock: '00:05:00',
currentSeconds: 300,
plusSeconds: 5,
isMyTurn: false),
ClockModel(
id: '2',
clock: '00:05:00',
currentSeconds: 300,
plusSeconds: 5,
isMyTurn: false),
];
}
void setInitialSharedPrefrences() {
// 設定初期化
initSettingClocks();
// sharedPreferencesに保存
updateSharedPrefrences();
}
/// SharedPrefrences保存
Future updateSharedPrefrences() async {
// ①Map型変換→②Json形式にエンコード→③リスト化
List<String> myClocks =
settingClocks.map((f) => json.encode(f.toJson())).toList();
SharedPreferences prefs = await SharedPreferences.getInstance();
// ④保存
await prefs.setStringList('settingClocks', myClocks);
print('updateSharedPrefrences: $myClocks');
}
}
async에서 비동기 처리화하여 SharedPreferences의 처리 자체는 await로 기다리게 하는 것을 잊지 마세요.
다음은 참고로 settingClocks에 대한 설정과 updateSharedPrefrences() 호출 부분의 코드입니다.
버튼 탭시의 처리로 설정 및 저장하고 있습니다.
settingsPage.dart
class SettingsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () {
Navigator.pop(context, '戻った');
return Future.value(false);
},
child: Scaffold(
appBar: AppBar(
title: Text('設定'),
actions: [
FlatButton(
child: Icon(Icons.refresh),
onPressed: () {
Provider.of<ClockProvider>(context, listen: false)
.setInitialSharedPrefrences();
},
),
],
),
body: SettingsPageHome(),
),
);
}
}
void initSettingClocks() {
settingClocks = [
ClockModel(
id: '1',
clock: '00:05:00',
currentSeconds: 300,
plusSeconds: 5,
isMyTurn: false),
ClockModel(
id: '2',
clock: '00:05:00',
currentSeconds: 300,
plusSeconds: 5,
isMyTurn: false),
];
}
void setInitialSharedPrefrences() {
// 設定初期化
initSettingClocks();
// sharedPreferencesに保存
updateSharedPrefrences();
}
SharedPreferences List 데이터를 읽는 방법
그림으로 나타내면 보시는 대로(이쪽도 어디까지나 이미지입니다).
보존 처리의 역으로부터 뒤따르는 느낌이군요.
코드는 다음과 같습니다.
clock.dart
/// SharedPrefrences読み出し
Future syncDataWithProvider() async {
print('syncDataWithProvider');
SharedPreferences prefs = await SharedPreferences.getInstance();
// ①読み出し
var result = prefs.getStringList('settingClocks');
print('result:$result');
// 読み出し確認
if (result != null) {
// ②デコード→③MapオブジェクトをClockModelに代入→④リストに変換
settingClocks =
result.map((f) => ClockModel.fromJson(json.decode(f))).toList();
} else {
// 必要に応じて初期化
}
}
다음은 참고까지 읽기 처리의 실행 부분입니다.
ClockProvider의 생성자에서 읽습니다.
clock.dart
class ClockProvider with ChangeNotifier {
List<ClockModel> settingClocks = [];
ClockProvider() {
syncDataWithProvider();
}
}
SharedPreferences에서 목록을 저장하는 데 도움이 되길 바랍니다.
참고
Reference
이 문제에 관하여(【Flutter】SharedPreferences로 List 데이터를 저장하는 방법 【도해 첨부】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mamoru_takami/items/2d930ee927c048060741텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)