import 'package:animations/animations.dart'; import 'package:dietary_guard/controllers/food_data.dart'; import 'package:dietary_guard/models/food_data.dart'; import 'package:dietary_guard/screens/food/details.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; class QueryScreen extends StatefulWidget { const QueryScreen({super.key}); @override State createState() => _QueryScreenState(); } class _QueryScreenState extends State { bool _isLoading = false; int _totalCount = 0; List _foodData = List.empty(); Future _searchFood(String probe) async { if (_isLoading) return; setState(() => _isLoading = true); final FoodDataController data = Get.find(); if (data.getApiKey() == null) return; final result = await data.searchFood(probe); setState(() { _totalCount = result.totalHits; _foodData = result.foods; _isLoading = false; }); } @override void initState() { super.initState(); final FoodDataController data = Get.find(); data.initialize(context); } @override Widget build(BuildContext context) { return Material( color: Theme.of(context).colorScheme.surface, child: SafeArea( child: Column( children: [ SearchBar( padding: const WidgetStatePropertyAll( EdgeInsets.symmetric(horizontal: 16.0), ), onSubmitted: (value) { _searchFood(value); }, leading: const Icon(Icons.search), ).paddingSymmetric(horizontal: 24), if (_isLoading) const SizedBox( width: 28, height: 28, child: CircularProgressIndicator(strokeWidth: 3), ).paddingSymmetric(vertical: 24) else Expanded( child: ListView.builder( itemCount: _foodData.length, itemBuilder: (context, index) { final item = _foodData[index]; return OpenContainer( closedBuilder: (_, open) => ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 24), title: Text(item.description), subtitle: Text( DateFormat("yyyy-MM-dd").format(item.publishedDate), ), onTap: () => open(), ), openBuilder: (_, __) => FoodDetailsScreen(item: item), openElevation: 0, closedElevation: 0, closedColor: Theme.of(context).colorScheme.surface, openColor: Colors.transparent, ); }, ).paddingOnly(top: 8), ), ], ), ), ); } }