플러터(Flutter)는 크로스 플랫폼 모바일 애플리케이션 개발을 위한 인기 있는 프레임워크입니다. 앱의 사용자 경험을 개선하기 위해 앱의 상태를 저장하고 복원하는 기능을 구현하는 것은 매우 중요합니다. 이번 블로그에서는 플러터에서 앱 상태를 저장 및 복원하는 여러 가지 방법을 알아보겠습니다.
1. SharedPreferences 사용하기
SharedPreferences
는 안드로이드와 iOS에서 데이터를 저장하고 검색하는 데 사용되는 간단한 키-값 쌍을 지원하는 플러그인입니다. 이 플러그인을 사용하여 앱의 상태를 영구적으로 저장하고 복원할 수 있습니다.
먼저, shared_preferences
라이브러리를 pubspec.yaml
파일에 추가합니다:
dependencies:
shared_preferences: ^2.0.6
다음으로, SharedPreferences
인스턴스를 생성하고 값을 저장하고 가져오는 예제 코드를 작성해보겠습니다:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late SharedPreferences _prefs;
String _userEmail = '';
@override
void initState() {
super.initState();
_initSharedPreferences();
}
Future<void> _initSharedPreferences() async {
_prefs = await SharedPreferences.getInstance();
setState(() {
_userEmail = _prefs.getString('user_email') ?? '';
});
}
Future<void> _saveUserEmail(String email) async {
await _prefs.setString('user_email', email);
setState(() {
_userEmail = email;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('앱 상태 저장 및 복원'),
),
body: Column(
children: [
Text('저장된 이메일: $_userEmail'),
TextFormField(
onChanged: (value) {
_saveUserEmail(value);
},
),
],
),
),
);
}
}
위의 코드는 플러터 앱을 생성하고 이메일 값을 저장하고 가져와 Text
위젯에 표시하는 간단한 예제입니다. 이제 앱을 실행하면 이메일 값을 입력할 수 있으며, 입력한 값은 shared_preferences
를 통해 저장되고 복원됩니다.
2. Provider 패키지 사용하기
Provider
패키지는 플러터에서 상태 관리를 위한 강력한 도구입니다. 이를 활용하여 앱 상태를 저장하고 복원할 수 있습니다.
먼저, provider
라이브러리를 pubspec.yaml
파일에 추가합니다:
dependencies:
provider: ^6.0.1
그런 다음, ChangeNotifier
클래스를 활용하여 앱 상태를 관리하고, Provider
위젯을 사용하여 앱 전체에 걸쳐 상태를 공유할 수 있습니다. 다음은 예제 코드입니다:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(MyApp());
}
class AppState extends ChangeNotifier {
String _userEmail = '';
String get userEmail => _userEmail;
Future<void> saveUserEmail(String email) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('user_email', email);
_userEmail = email;
notifyListeners();
}
Future<void> getUserEmail() async {
final prefs = await SharedPreferences.getInstance();
_userEmail = prefs.getString('user_email') ?? '';
notifyListeners();
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => AppState(),
child: MaterialApp(
home: Consumer<AppState>(
builder: (context, appState, _) => Scaffold(
appBar: AppBar(
title: Text('앱 상태 저장 및 복원'),
),
body: Column(
children: [
Text('저장된 이메일: ${appState.userEmail}'),
TextFormField(
onChanged: (value) {
appState.saveUserEmail(value);
},
),
],
),
),
),
),
);
}
}
위의 코드는 AppState
클래스를 생성하여 앱 상태를 관리하고, ChangeNotifierProvider
를 통해 앱 전체에 걸쳐 상태를 공유하도록 설정한 예제입니다. 상태를 변경하고 앱 상태가 업데이트될 때마다 notifyListeners
를 호출하여 위젯이 다시 렌더링되도록 합니다.
결론
플러터에서 앱 상태를 저장 및 복원하기 위해 SharedPreferences
와 Provider
패키지를 사용하는 방법을 배웠습니다. 이러한 기능을 활용하여 사용자가 앱을 다시 실행하거나 앱을 배경으로 전환하는 등의 상황에서도 앱의 상태를 올바르게 유지할 수 있습니다. 이러한 상태 관리 기술을 응용하여 다양한 기능을 구현하는 등의 활용도를 높일 수 있습니다.