[Flutter] 데이터 저장 (1) shared_preferences
db를 이용하는 것을 제외하고, 적은양의 데이터를 앱의 데이터를 저장하는 방법은 크게 두 가지이다.
1. 공유 환경설정(shared-preferences)
2. 파일(path_provider)
오늘은 공유 환경설정을 통해 데이터를 저장하는 법을 살펴보겠다.
이 방법은 비교적 크기가 작은 데이터를 저장할 때 쓴다.
사용자가 앱테마를 다크모드로 설정했을 때, 이를 다음 실행 시에도 적용시키는 등의 간단한 환경설정에 주로 쓰인다.
플러터 프로젝트 실행시 기본으로 나타나는 데모앱에 +버튼을 눌러보자.
아무리 눌러도 앱을 종료하고 다시 키면 다시 초기화(0)가 되어있다.
이번엔 shared_preferences 클래스를 이용해, 앱을 다시 시작해도 _counter의 숫자가 저장되게 할 것이다.
우선 의존성에 shared_preferences 패키지를 등록하자
main.dart 파일은 아래와 같다
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _setData(int value) async{
SharedPreferences pref = await SharedPreferences.getInstance();
pref.setInt('count', value);
}
void _loadData() async{
SharedPreferences pref = await SharedPreferences.getInstance();
setState(() {
var value = pref.getInt('count');
if ( value == null){
_counter = 0;
} else {
_counter = value;
}
});
}
@override
void initState() {
super.initState();
_loadData();
}
void _incrementCounter() {
setState(() {
_counter++;
_setData(_counter);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
// 이하 생략
생략된 부분은 건들지 않은 부분이다.
우선 아래부터 살펴부자
기존의 _incrementCounter()의 setState 내에 _counter++; 아래에다 _counter를 받는_setData() 함수를 호출해주었다.
숫자가 늘어날 때마다 데이터에 저장해줄 것이다.
그리고 바로 그 위에 initState() 내에는 _loadData() 함수를 불러왔다.
앱이 시작될 때 저장된 데이터를 불러올 것이다.
이제 _setData()와 _loadData() 함수를 보자.
각각 SharedPreferences 클래스에서 제공하는
세터함수(SharedPreferences.getInstance().setInt(), 데이터를 저장하는 함수)와
게터함수SharedPreferences.getInstance().gettInt(), 데이터를 불러오는 함수)를 사용하였다.
물론 여기선 숫자를 저장하기 위해 Int를 이용했지만 공유 환경설정에 저장할 수 있는 값은 int, String, bool, double, StringList 등 다양하다.
각 함수는
setInt(key, value)
getInt(key)
이렇게 파라미터를 갖는데
여기서 value는 _counter를 아규먼드로 받고
key는 이 _counter값을 서로 연동시켜줄 연결고리이다.
그러니 당연히 둘의 키값은 같아야하며, 다른 변수명과 겹치지 않도록 해야한다.
++ 데이터를 삭제할 땐 remove()함수를 쓰자. 마찬가지로 같은 키값을 전달해주면 된다.
final pref = await SharedPreferences.getInstance();
pref.remove('counter');