Значок не меняется после его нажатия — трепетание

#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(контекст);