Files
davide eb7912421c feat: riscrivi app in Flutter
Riscrittura completa da Vue 3 + Capacitor a Flutter/Dart.

Architettura feature-based (lib/features/):
- meal_planner: modello MealPlan/DayPlan, provider, pagina e widget
- converter: modello ConversionEntry, provider con ricerca, pagina
- shopping_list: modello ShoppingItem, provider con deduplicazione, pagina e widget

Core:
- Material 3 con seed color #2d6a4f
- NavigationBar + IndexedStack (preserva stato dei tab)
- Portrait lock via SystemChrome
- Persistenza con shared_preferences
- 50+ alimenti × metodi cottura in assets/data/conversions.json

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:41:26 +02:00

78 lines
1.9 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../models/conversion_entry.dart';
class ConverterProvider extends ChangeNotifier {
List<ConversionEntry> _db = [];
List<ConversionEntry> _results = [];
ConversionEntry? _selected;
double? _grams;
bool _rawToCooked = true;
List<ConversionEntry> get results => _results;
ConversionEntry? get selected => _selected;
double? get grams => _grams;
bool get rawToCooked => _rawToCooked;
double? get result {
if (_selected == null || _grams == null || _grams! <= 0) return null;
final v = _rawToCooked
? _selected!.rawToCooked(_grams!)
: _selected!.cookedToRaw(_grams!);
return (v * 10).roundToDouble() / 10;
}
Future<void> loadDb() async {
final raw = await rootBundle.loadString('assets/data/conversions.json');
final Map<String, dynamic> json = jsonDecode(raw);
_db = [
for (final food in json.keys)
for (final method in (json[food] as Map).keys)
ConversionEntry(
food: food,
method: method,
yieldFactor:
(json[food][method]['yield'] as num).toDouble(),
),
];
notifyListeners();
}
void search(String q) {
if (q.trim().isEmpty) {
_results = [];
} else {
final lower = q.toLowerCase();
_results = _db.where((e) => e.food.contains(lower)).toList();
}
notifyListeners();
}
void select(ConversionEntry entry) {
_selected = entry;
_results = [];
_grams = null;
notifyListeners();
}
void setGrams(double? value) {
_grams = value;
notifyListeners();
}
void swapDirection() {
_rawToCooked = !_rawToCooked;
_grams = null;
notifyListeners();
}
void reset() {
_selected = null;
_results = [];
_grams = null;
_rawToCooked = true;
notifyListeners();
}
}