Como Utilizar SharedPreferences no Flutter para Persistência de Dados
Introdução
O SharedPreferences é uma solução leve e eficiente para persistir dados simples no Flutter. Ele é amplamente utilizado para armazenar informações como preferências do usuário, configurações e pequenos estados que não precisam de uma solução mais robusta como um banco de dados.
Neste tutorial, você aprenderá a configurar e utilizar o SharedPreferences no Flutter, abordando cenários práticos, melhores práticas e limitações.
—
1. O que é SharedPreferences?
O SharedPreferences permite armazenar dados como pares chave: valor
de forma persistente no dispositivo. Os dados permanecem armazenados mesmo que o aplicativo seja fechado.
Os tipos de dados suportados incluem:
String
int
double
bool
List
—
2. Configurando o SharedPreferences
Adicione o pacote ao arquivo pubspec.yaml
:
dependencies:
shared_preferences: ^2.0.0
Depois, execute:
flutter pub get
—
3. Armazenando e Recuperando Dados
Vamos começar com um exemplo básico de como salvar e recuperar dados:
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(
home: SharedPreferencesExample(),
);
}
}
class SharedPreferencesExample extends StatefulWidget {
@override
_SharedPreferencesExampleState createState() => _SharedPreferencesExampleState();
}
class _SharedPreferencesExampleState extends State {
late SharedPreferences prefs;
String? savedValue;
@override
void initState() {
super.initState();
_loadPreferences();
}
Future _loadPreferences() async {
prefs = await SharedPreferences.getInstance();
setState(() {
savedValue = prefs.getString('exampleKey');
});
}
Future _saveValue(String value) async {
await prefs.setString('exampleKey', value);
setState(() {
savedValue = value;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("SharedPreferences Example")),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (savedValue != null)
Text("Valor salvo: \$savedValue", style: const TextStyle(fontSize: 18)),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () => _saveValue("Olá, Flutter!"),
child: const Text("Salvar Valor"),
),
],
),
),
);
}
}
—
4. Exemplo Avançado: Tema Escuro
Vamos criar um exemplo mais avançado onde o SharedPreferences é usado para salvar as preferências de tema do usuário.
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = await SharedPreferences.getInstance();
final isDarkMode = prefs.getBool('isDarkMode') ?? false;
runApp(MyApp(isDarkMode: isDarkMode));
}
class MyApp extends StatelessWidget {
final bool isDarkMode;
const MyApp({Key? key, required this.isDarkMode}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: isDarkMode ? ThemeData.dark() : ThemeData.light(),
home: ThemeSwitcher(),
);
}
}
class ThemeSwitcher extends StatefulWidget {
@override
_ThemeSwitcherState createState() => _ThemeSwitcherState();
}
class _ThemeSwitcherState extends State {
late bool isDarkMode;
@override
void initState() {
super.initState();
_loadTheme();
}
Future _loadTheme() async {
final prefs = await SharedPreferences.getInstance();
setState(() {
isDarkMode = prefs.getBool('isDarkMode') ?? false;
});
}
Future _toggleTheme() async {
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('isDarkMode', !isDarkMode);
setState(() {
isDarkMode = !isDarkMode;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Theme Switcher")),
body: Center(
child: SwitchListTile(
title: const Text("Modo Escuro"),
value: isDarkMode,
onChanged: (value) => _toggleTheme(),
),
),
);
}
}
—
5. Limitações do SharedPreferences
Apesar de ser uma ferramenta poderosa, o SharedPreferences tem algumas limitações:
- Não é ideal para grandes volumes de dados.
- Não suporta tipos complexos como objetos ou listas de objetos (você pode usar JSON como alternativa).
- Não é criptografado por padrão.
Para dados sensíveis ou grandes volumes, considere usar soluções como SQLite ou Hive.
—
Publicar comentário