the code below is my riverpod
provider file which I am using sqflite and path package in there:
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path/path.dart' as path;
import 'package:sqflite/sqflite.dart' as sql;
import 'package:sqflite/sqlite_api.dart';
import 'package:coffee_shop_app/models/coffee.dart';
Future<Database> _getDatabase() async {
final dbPath = await sql.getDatabasesPath();
final db = await sql.openDatabase(
path.join(dbPath, 'coffee.db'),
onCreate: (db, version) {
return db.execute(
'CREATE TABLE cart_provider(id TEXT PRIMARY KEY, coffeeImage TEXT, CoffeeName TEXT, CoffeePrice REAL)');
},
version: 1,
);
return db;
}
class CartNotifier extends StateNotifier<List<Coffee>> {
CartNotifier() : super([]);
Future<void> loadCoffee() async {
final db = await _getDatabase();
final data = await db.query('cart_provider');
final coffees = data
.map(
(row) => Coffee(
id: row['id'] as String,
coffeeImage: row['coffeeImage'] as String,
coffeeName: row['coffeeName'] as String,
coffeePrice: row['coffeePrice'] as double,
),
)
.toList();
state = coffees;
}
void addCoffee(Coffee coffee) async {
if (state.contains(coffee)) {
return;
} else {
final db = await _getDatabase();
db.insert(
'cart_provider',
{
'id': coffee.id,
'coffeeImage': coffee.coffeeImage,
'coffeeName': coffee.coffeeName,
'coffeePrice': coffee.coffeePrice,
},
);
state = [...state, coffee];
}
}
void removeCoffee(Coffee coffee) async {
final db = await _getDatabase();
await db.delete(
'cart_provider',
where: 'id = ?',
whereArgs: [coffee.id],
);
state = state.where((c) => c != coffee).toList();
}
}
final cartProvider = StateNotifierProvider<CartNotifier, List<Coffee>>(
(ref) {
return CartNotifier();
},
);
and the code below is where I am using the provider to show listView
:
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:coffee_shop_app/provider/cart_provider.dart';
import 'package:coffee_shop_app/components/registered_coffee_item.dart';
class CartScreen extends ConsumerStatefulWidget {
const CartScreen({super.key});
@override
ConsumerState<CartScreen> createState() => _CartScreenState();
}
class _CartScreenState extends ConsumerState<CartScreen> {
late Future<void> _coffeesFuture;
@override
void initState() {
super.initState();
_coffeesFuture = ref.read(cartProvider.notifier).loadCoffee();
}
@override
Widget build(BuildContext context) {
final registeredCoffees = ref.watch(cartProvider);
return FutureBuilder(
future: _coffeesFuture,
builder: (context, snapshot) =>
snapshot.connectionState == ConnectionState.waiting
? const Center(
child: CircularProgressIndicator(),
)
: Column(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20,
vertical: 20,
),
child: ListView(
children: [
...registeredCoffees.map((coffee) {
return RegisteredCoffeeItem(
coffee: coffee,
icon: Icons.delete,
);
}),
],
),
),
),
],
),
);
}
}
the problem is that when I reload my app the data is not saved!
I checked my codes a few times and I watched some youtube videos. everything looks fine even in my debug console but when I reload my app the data is not saved.
New contributor
Ehsan Javdan is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.