85 lines
2.3 KiB
Dart
85 lines
2.3 KiB
Dart
import 'package:dietary_guard/controllers/food_data.dart';
|
|
import 'package:dietary_guard/models/food_data.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<QueryScreen> createState() => _QueryScreenState();
|
|
}
|
|
|
|
class _QueryScreenState extends State<QueryScreen> {
|
|
bool _isLoading = false;
|
|
|
|
int _totalCount = 0;
|
|
List<FoodData> _foodData = List.empty();
|
|
|
|
Future<void> _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 SafeArea(
|
|
child: Column(
|
|
children: [
|
|
SearchBar(
|
|
padding: const WidgetStatePropertyAll<EdgeInsets>(
|
|
EdgeInsets.symmetric(horizontal: 16.0),
|
|
),
|
|
onSubmitted: (value) {
|
|
_searchFood(value);
|
|
},
|
|
leading: const Icon(Icons.search),
|
|
).paddingSymmetric(horizontal: 24),
|
|
if (_isLoading)
|
|
const SizedBox(
|
|
width: 20,
|
|
height: 20,
|
|
child: CircularProgressIndicator(strokeWidth: 3),
|
|
).paddingSymmetric(vertical: 16)
|
|
else
|
|
Expanded(
|
|
child: ListView.builder(
|
|
itemCount: _foodData.length,
|
|
itemBuilder: (context, index) {
|
|
final item = _foodData[index];
|
|
return ListTile(
|
|
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
|
|
title: Text(item.description),
|
|
subtitle: Text(
|
|
DateFormat("yyyy-MM-dd").format(item.publishedDate),
|
|
),
|
|
);
|
|
},
|
|
).paddingOnly(top: 8),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|