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