[Flutter] 입력한 데이터를 간단하게 저장하고 불러오는 패키지를 소개합니다.(shared_preferences)

간단한 데이터를 위한 플랫폼별 영구 스토리지를 저장합니다.

(예: iOS 및 macOS NSUserDefaults, Android SharedPreferences 등). 

데이터는 비동기적으로 디스크에 저장되며 삭제 후 재설치 하면 데이터가 삭제되는 패키지입니다. 따라서 이 플러그인은 중요한 데이터를 저장하는데 사용되어서는 안됩니다.

지원하는 데이터 유형은 int, double, bool, String, List <String>입니다.

일시적으로 데이터를 저장하는 방법만 권장하고, 영구적으로 데이터를 저장한다면 SqfLite나 Hive 등에도 있는 것 같습니다만, 로컬 DB를 사용하는 것이 추천되고 있습니다.(이건  추후에 소개시켜 드릴께요.)


home/home_page.dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  String textInit = "초기화";
  // 값을 입력 받는 변수
  final TextEditingController _nameController = TextEditingController();
  // prefs.setString으로、String형식의 데이터 저장
  _saveData() async {

    String nameValue = _nameController.text;
    final prefs = await SharedPreferences.getInstance();
    // nameValue의 값을 name변수에 저장한다. prefs.setString을 사용
    await prefs.setString("name", nameValue);
  }
  //데이터 가져오기
  _getData() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      textInit = prefs.getString("name") ?? "아무것도없다.";
    });
  }
  //이제 슬슬 느낌 오시죠? name라는 키의 데이터를 삭제합니다.
  _removeData() async {
    final prefs = await SharedPreferences.getInstance();
    prefs.remove("name");
    setState(() {
      textInit = "";
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.blueGrey,
        title: Text("shared_preferences을 사용해보자"),
      ),
      body: Container(
        padding: EdgeInsets.all(32),
        child: Column(
          children: [
            Text(
              textInit,
              style: TextStyle(
                fontSize: 20,
              ),
            ),
            TextField(
              keyboardType: TextInputType.text,
              decoration: InputDecoration(labelText: "이름을 입력해주세요."),
              controller: _nameController,
            ),
            Row(
              children: [
                const SizedBox(width: 30),
                ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    primary: Colors.blue, // background
                    onPrimary: Colors.white, // foreground
                  ),
                  onPressed: _saveData,
                  child: Text('저장'),
                ),
                const SizedBox(width: 30),
                ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    primary: Colors.green, // background
                    onPrimary: Colors.white, // foreground
                  ),
                  onPressed: _getData,
                  child: Text('불러오기'),
                ),
                const SizedBox(width: 30),
                ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    primary: Colors.red, // background
                    onPrimary: Colors.white, // foreground
                  ),
                  onPressed: _removeData,
                  child: Text('삭제'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}


main.dart


import 'package:flutter/material.dart';
import 'package:local_save/screen/home_page.dart';

void main() {
  runApp(const MyApp());
  // runApp(ProviderScope(child: const MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'SharedPreferences Demo',
      home: Home(),
    );
  }
}


자료형이 

await
prefs.setInt('cnt', 10); await prefs.setBool('repeat', true); await prefs.setDouble('decimal', 1.5); await prefs.setString('action', 'Start'); await prefs.setStringList('items', <String>['Earth', 'Moon', 'Sun']);

등등의 형식이 있습니다. 필요에 따라서 골라서 사용하시면 되겠습니다.

살짝 복잡한 자료 형식이라면 아예 데이터베이스 형식의 SqfLite를 사용하셔도 되겠지만
저는 setString을 이용해서 json형식으로 저장하는것도 선호합니다.

그것도 다음시간에....

즐거운 코딩되세요.




댓글