использование кнопки избранного с общими предпочтениями в Listview

#flutter #dart

#flutter #dart

Вопрос:

у меня появляется кнопка избранного в представлении списка, когда я нажимаю на нее и выбираю все элементы в списке, как я могу это исправить используя общие предпочтения, вот мой код: в моем состоянии stfl :

   static const likedKey = 'liked_key';

  bool liked;

  @override
  void initState() {
    super.initState();
    _restorePersistedPreference();
  }

  void _restorePersistedPreference() async {
    var preferences = await SharedPreferences.getInstance();
    var liked = preferences.getBool(likedKey) ?? false;
    setState(() => this.liked = liked);
  }

  void _persistPreference() async {
    setState(() => liked = !liked);
    var preferences = await SharedPreferences.getInstance();
    preferences.setBool(likedKey, liked);
  }  

Мой код LikeButton:

 IconButton(
                icon: Icon(
                  liked ? Icons.favorite : Icons.favorite_border,
                  color: liked ? Colors.red : Colors.grey,
                ),
                onPressed: _persistPreference,
              ),
  

Комментарии:

1. пожалуйста, объясните вашу проблему намного яснее и с более подробной информацией. Никто не понимает вашу проблему

2. У меня есть listview, как сообщения, в порядке? у каждого сообщения есть кнопка = нравится. когда пользователь нажимает кнопку «Нравится», он меняет все записи на «Понравилось»! очистить?

3. Теперь я понимаю это. Это потому, что у всех них есть общая переменная с именем like. Поэтому, когда вы измените значение «понравилось» на true, все они будут «понравились».

4. Да, точно, могу я оставить вам dm?

5. Я опубликовал ответ @Ramzi. Вам нужно сгенерировать список<bool>, а затем изменить каждое отдельное значение, если пользователь нажмет на кнопку.

Ответ №1:

Вы можете решить свою проблему, сгенерировав List<bool> . Поскольку нажатие кнопки IconButton изменит значение параметра liked, все ваши значки станут Icons.favorite, потому что все они ссылаются на один и тот же bool, который вам понравился. Вот пример того, как вы можете это исправить:

   @override
  Widget build(BuildContext context) {
   List<bool> likedList=[];
   List<bool>.generate(yourItem.length, (i) => likedList.add(false);
   return ListView.builder(
    itemcount:yourItem.length,
    itemBuilder:(BuildContext context,int index){
     return IconButton(
             icon: Icon(
                      likedList[index] ? Icons.favorite : Icons.favorite_border,
                      color: likedList[index] ? Colors.red : Colors.grey,
             ),
             onPressed:()=> likedList[index]=!likedList[index], //toggle bool value
       );
     }
    )