Search code examples
flutterstoreflutter-getxdata-storage

Flutter Getx Store Data locally


I am currently working on an app where the user can mark ListTimes as favorites. These favorites are then displayed on a second page.

I am using GetX for this and the functionality works. But as soon as the app gets closed the state of the app resets and the favorites are deleted.

Does anyone knows how I can store the favorites locally?

Here is my code:

GetX controller:

import 'package:get/state_manager.dart';

class FavouriteController extends GetxController {
  var favItems = <Entries>[].obs;
  int get count => favItems.length;

  addToCart(Entries product) {
    favItems.add(product);
  }

Favorites page:

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


class Favs extends StatelessWidget {
  final favouritesController = Get.put(FavouriteController());
  final entriesController = Get.put(EntriesController());

  Favs({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: backGround,
      appBar: AppBar(
        backgroundColor: appbarColor,
        title: const Text('Favs'),
      ),
      body: SafeArea(
        child: Column(
          children: [
            const SizedBox(height: 10),
            Expanded(
              child: GetX<FavouriteController>(
                builder: (controller) {
                  return ListView.builder(
                    itemCount: controller.favItems.length,
                    itemBuilder: (context, index) {
                      return Card(
                          margin: const EdgeInsets.all(12),
                          color: container,
                          shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(15.0)),
                          child: ListTile(
                            title: Text(
                              controller.favItems[index].name,
                              style: const TextStyle(
                                  fontSize: 16, color: Colors.white),
                            ),
                            trailing: IconButton(
                              onPressed: () {
                                favouritesController
                                    .deleteEntries(controller.favItems[index]);
                              },
                              icon: const Icon(
                                Icons.delete_forever,
                                color: titleColor,
                              ),
                            ),
                            onTap: () {
                              Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => controller
                                          .favItems[index].navigation));
                            },
                          ));
                    },
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Solution

  • With sqflite you can store data on device.

    terminal:

    flutter pub add sqflite and flutter pub get

    import 'package:sqflite/sqflite.dart';
    
    // Get a location using getDatabasesPath
    var databasesPath = await getDatabasesPath();
    String path = join(databasesPath, 'demo.db');
    
    // Delete the database
    await deleteDatabase(path);
    
    // open the database
    Database database = await openDatabase(path, version: 1,
        onCreate: (Database db, int version) async {
      // When creating the db, create the table
      await db.execute(
          'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)');
    });
    
    // Insert some records in a transaction
    await database.transaction((txn) async {
      int id1 = await txn.rawInsert(
          'INSERT INTO Test(name, value, num) VALUES("some name", 1234, 456.789)');
      print('inserted1: $id1');
      int id2 = await txn.rawInsert(
          'INSERT INTO Test(name, value, num) VALUES(?, ?, ?)',
          ['another name', 12345678, 3.1416]);
      print('inserted2: $id2');
    });
    
    // Update some record
    int count = await database.rawUpdate(
        'UPDATE Test SET name = ?, value = ? WHERE name = ?',
        ['updated name', '9876', 'some name']);
    print('updated: $count');
    
    // Get the records
    List<Map> list = await database.rawQuery('SELECT * FROM Test');
    List<Map> expectedList = [
      {'name': 'updated name', 'id': 1, 'value': 9876, 'num': 456.789},
      {'name': 'another name', 'id': 2, 'value': 12345678, 'num': 3.1416}
    ];
    print(list);
    print(expectedList);
    assert(const DeepCollectionEquality().equals(list, expectedList));
    
    // Count the records
    count = Sqflite
        .firstIntValue(await database.rawQuery('SELECT COUNT(*) FROM Test'));
    assert(count == 2);
    
    // Delete a record
    count = await database
        .rawDelete('DELETE FROM Test WHERE name = ?', ['another name']);
    assert(count == 1);
    
    // Close the database
    await database.close();
    

    (is a quote)

    More detailed information: https://pub.dev/packages/sqflite