#flutter #icons #favorites
#флаттер #Значки #Избранное
Вопрос:
Я работаю над созданием избранной страницы. Для каждой страницы продукта я размещаю на панели приложений значок избранного, который предполагается изменить, и добавляю конкретный продукт в избранное пользователя.
Мне не удается изменить состояние значка после его нажатия.
class FoodDetail extends StatefulWidget {
@override
_FoodDetail createState()=> _FoodDetail();
const FoodDetail({Key key}) : super(key: key);
}
class _FoodDetail extends State<FoodDetail>{
@override
Widget build(BuildContext context) {
FoodNotifier foodNotifier = Provider.of<FoodNotifier>(context);
_onFoodDeleted(Food food) {
Navigator.pop(context);
foodNotifier.deleteFood(food);
}
final _saved = Set<BuildContext>();
final alreadySaved = _saved.contains(context);
return Scaffold(
appBar: AppBar(
title: Text(foodNotifier.currentFood.name),
actions: <Widget>[
// action button
new IconButton(
icon: alreadySaved ? Icon(Icons.star) : Icon(Icons.star_border),
color: alreadySaved ? Colors.yellow[500] : null,
onPressed: (){
setState(() {
if (alreadySaved) {
_saved.remove(context);
} else {
_saved.add(context);
}
});}
Ответ №1:
Ваши состояния не меняются, потому что вы помещаете их в build
метод, который всегда их повторно инициализирует.
Поместите свои состояния _saved
alreadySaved
вне build
метода.
final _saved = Set<BuildContext>();
final alreadySaved = _saved.contains(context);
@override
Widget build(BuildContext context) {
}
Комментарии:
1. это работает следующим образом: final _saved = Set<BuildContext>(); @переопределить сборку виджета (контекст BuildContext) { final alreadySaved = _saved.contains(контекст);