목차
- SharedPreferences
- SharedPreferences 란?
- 사용 예시
- pubspec.yaml 설정
- 메소드 및 변수 작성
- Scaffold 위젯 작성
- SharedPreferences 에러 처리 방법
- 터미널에 명령어 입력
- pubspec.yaml 설정 변경
- flutter 재실행
✅ SharedPreferences
1️⃣ SharedPreferences 란?
- 간단한 데이터를 디스크에 저장하여 사용하는 방식
- 사용 예 : 자동 로그인 여부, 마지막 방문 페이지, 다크모드 설정 여부 등...
- 특징 : 비동기 API 이기 때문에 Future 기반(async/await)으로 동작
✅ 사용 예시
1️⃣ pubspec.yaml 설정

2️⃣ 메소드 및 변수 작성
1. 메소드 및 변수 선언
1-1. late : 플러터 null-safty가 적용된 이후 사용. '지금 초기화하지 않고 나중에 초기화'를 할 때 사용.
** late로 선언된 변수는 non-nullable이지만 나중에 값을 채우겠다는 뜻
** late 미사용 시, 런타임 에러가 발생
1-2. TextEditingController : 텍스트 입력을 다루는 위젯(TextField, TextFormField)을 제어하기 위해 쓰는 컨트롤러
2. 앱 초기화 : 입력받을 데이터가 있을 경우, 더미 데이터로 인한 오류 발생을 방지하기 위해 초기화를 진행
3. java에서의 getter/setter
3-1. SharedPreferences 타입은 map 형태를 띄고 있어 key-value 로 사용
3-2. Dart언어에서의 "??" : java에서 삼항 연산자와 같은 역할

3️⃣ Scaffold 위젯 작성
1. body의 최상단
2. 데이터를 입력받을(TextField 위젯) 영역
3. 하단 버튼

4️⃣ 테스트

✅ SharedPreferences 에러 처리 방법
✔️ pusbpec.yaml 에 "shared_preferences:" 입력 후 main.dart 에서 SharedPreferences 에러가 날 때 처리 방법

1️⃣ 터미널에 명령어 입력
- flutter pub get : Flutter 패키지를 다운로드하고 프로젝트에 적용하는 명령어
- flutter upgrade : Flutter 추가 적용 사항을 반영하는 명령어

2️⃣ pubspec.yaml 설정 변경
** 너무 최신 버젼도 에러가 생김 (ex. ^3.0.x)

3️⃣ flutter 재실행 (run)

✔️ 사용된 코드
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() { // 컴파일러의 시작 지점 (void main())
runApp(const MyApp());
}
class MyApp extends StatelessWidget { // main() 에서 반환되는 위젯
const MyApp({super.key}); // const : 상수 역할을 함으로써 build시 불필요한 rebuild를 방지하기 위해 위젯을 재사용
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: const MyHomePage(), // 앱 실행시, 첫 번째로 띄워질 화면
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage>{
late SharedPreferences _prefs; // late : 플러터 null-safety 적용된 이후, null 허용 설정 시 사용
String _username = ""; // 언더바(_) : java에서 private 역할과 동일
// TextEditingController : Flutter 에서 텍스트 필드(TextField, TextFormField) 와 같이 텍스트 입력을 다루는 위젯을 제어하기 위해 쓰는 컨트롤러
final TextEditingController _usernameController = TextEditingController();
@override
void initState(){ // initState : 앱 시작 시, 초기화 해주는 메소드
super.initState();
_getUsername();
}
_saveUsername(){
setState((){
_username = _usernameController.text; // _usernameController.text : 유저가 입력한 값
_prefs.setString("currentUsername", _username);
print("username : $_username"); // _username
String? test = _prefs.getString("currentUsername"); // SharedPreferences 타입이라 String? 으로 타입을 지정해야함
print("test : $test");
});
}
_getUsername() async{ // 비동기 처리를 위해 async
_prefs = await SharedPreferences.getInstance();
setState((){
_username = _prefs.getString("currentUsername") ?? "";
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Test App"),
),
body: Container(
child: Column(
children: [
Padding(
padding: EdgeInsets.all(15),
child: Text("현재 사용자 이름 : $_username"),
),
Container(
padding: EdgeInsets.all(15),
child: TextField(
controller: _usernameController,
textAlign: TextAlign.left,
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: "이름을 입력하세요",
)
),
),
ElevatedButton(
onPressed: () => _saveUsername(), // 람다식 : 클릭 시, 작동할 메소드(or 기능)
child: Text("저장"),
)
],
),
),
);
}
}
'IT 언어 > Flutter' 카테고리의 다른 글
| [Flutter] 아래로 스와이프하여 새로고침 (RefreshIndicator) [맥북💻] (0) | 2025.09.23 |
|---|---|
| [Flutter] 앱 하단 네비게이션 (bottomNavigationBar, TabBar, setState) [맥북 💻] (0) | 2025.09.21 |
| [Flutter] JSON 데이터 불러오기 (Future, async) [맥북💻] (0) | 2025.09.16 |
| [Flutter] 페이지 이동 (Navigator) [맥북💻] (0) | 2025.09.15 |
| [Flutter] 이미지 불러넣기 (Image 위젯, NetworkImage 위젯) [맥북💻] (0) | 2025.09.14 |