class Ingredient { final int? id; final String name; // e.g., "Vitamin K2", "Vitamin D3" final double amount; // e.g., 75, 20 final String unit; // e.g., "mcg", "mg", "IU" const Ingredient({ this.id, required this.name, required this.amount, required this.unit, }); Map toMap() { return { 'id': id, 'name': name, 'amount': amount, 'unit': unit, }; } factory Ingredient.fromMap(Map map) { return Ingredient( id: map['id'], name: map['name'], amount: map['amount']?.toDouble() ?? 0.0, unit: map['unit'], ); } Ingredient copyWith({ int? id, String? name, double? amount, String? unit, }) { return Ingredient( id: id ?? this.id, name: name ?? this.name, amount: amount ?? this.amount, unit: unit ?? this.unit, ); } @override String toString() { return '$amount$unit $name'; } @override bool operator ==(Object other) { if (identical(this, other)) return true; return other is Ingredient && other.name == name && other.amount == amount && other.unit == unit; } @override int get hashCode { return name.hashCode ^ amount.hashCode ^ unit.hashCode; } }