Flutter

[Flutter] 데이터 저장 (1) shared_preferences

자랄수있다 2022. 9. 12. 16:19

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');