Я пытаюсь разрешить пользователю пометить элемент, создаваемый ListViewBuilder, как избранный. С моим текущим кодом, когда пользователь добавляет в избранное один эпизод, все эпизоды помечаются как избранные. Я бы хотел, чтобы пользователь мог добавлять каждый эпизод отдельно в избранное и сохранять его после перезапуска. У меня есть данные, сохраненные в базе данных firebase, но похоже, что это должно обрабатываться в самом приложении.

Каков наилучший способ сделать это? Благодарность!

Вот мой текущий код:

class Epi {
  final String endTime;
  final String name;
  final String networkName;
  final String showName;
  final String startTime;

  Epi({this.endTime, this.name, this.networkName, this.showName, this.startTime});

  factory Epi.fromJson(Map<dynamic, dynamic> parsedJson) {
    DateTime endTimeCon = DateTime.parse(parsedJson['endTime']);
    String newEndTime = formatDate(endTimeCon, [yyyy, '/', mm, '/', dd, ' ', hh, ':', nn, ':', ss, ' ', am]);

    DateTime startTimeCon = DateTime.parse(parsedJson['startTime']);
    String newStartTime = formatDate(startTimeCon, [yyyy, '/', mm, '/', dd, ' ', hh, ':', nn, ':', ss, ' ', am]);

    return Epi(
      endTime: newEndTime,
      name: parsedJson['name'],
      networkName: parsedJson['networkName'],
      showName: parsedJson['showName'],
      startTime: newStartTime,
    );
  }
}
  bool _isFavorited = true;
  void _toggleFavorite() {
    setState(() {
      if (_isFavorited) {
        _isFavorited = false;
      } else {
        _isFavorited = true;
      }
    });
  }
body: Column(
          children: <Widget>[
            SizedBox(height: 5.0),
            Expanded(
              child: ListView.builder(
                  itemCount: elist.length,
                  itemBuilder: (context, index) {
                    return InkWell(
                      onTap: () {
                        selectEpisode(index);
                      },
                      child: Card(
                        child: Column(
                          children: <Widget>[
                          ListTile(
                            title: Text(elist[index].name),
                            subtitle: Text(elist[index].startTime),
                            leading: IconButton(
                              icon: (_isFavorited ? Icon(Icons.favorite_border) : Icon(Icons.favorite)),
                              color: Colors.red[500],
                              onPressed: _toggleFavorite,
                            ),
                            trailing: Icon(Icons.arrow_forward_ios)
                          )
                          ],
                        ),
                      ),
                    );
                  }),
            ),
          ],
        )
1
Stridermn 14 Июн 2020 в 17:47

2 ответа

Лучший ответ

В моем приложении Congress Fahrplan (Github) я делаю именно то, чего вы хотите достичь.

В favourite_provider я сохраняю значение в самом объекте и добавить его в мой список избранных объектов. Каждый раз, когда объект добавляется в этот список, список записывается на диск как JSON с моим file_storage класс.

При перезапуске приложения объекты извлекаются из REST API. Затем я сопоставляю их идентификаторы с объектами из локального JSON и устанавливаю, добавлены ли они в избранное или нет, чтобы восстановить состояние избранного.

2
benjaminschilling33 15 Июн 2020 в 07:57

Составление списка избранных элементов в основном зависит от дизайна приложения, и вы также можете разработать свою собственную логику для этой цели. Хотя то, что опубликовал @ benjaminschilling33, правда, вы также можете добиться этого простым способом. Я бы добавил в конструктор логическое значение isFavorite следующим образом:

 class Epi {
  final String endTime;
  final String name;
  final String networkName;
  final String showName;
  final String startTime;
  bool isFavorite;
}
//initialize the isFavorite to false cause no item in your list is is favorite at the beginning
Epi({this.endTime, this.name, this.networkName, this.showName, this.startTime, this.isFavorite=false});

//lets create a list _episode which contains all the movie for demonstration purpose
List<Epi> _episode = [Epi(initialized data)]; 
//create a getter for the list
List<Epi> get episode{
  return _episode.where((Epi episode) => episod.isFavorite).toList(); //this will return a list where the isFavorite is true
}

//You can then set your icon (in the list-tile) based on your isFavorite result
ListTile(
...
icon: Icons(elist[index].isFavorite?Icon(Icons.favorite):Icon(Icons.favorite_border);
)
//Then adjust the logic on your onPress
onPressed: (){
   setState((){
    elist[index].isFavorite=!elist[index].isFavorite //this will vary from true to false and vice versa when pressed
});
}

Это самый простой способ добавить список элементов, добавленных пользователем в избранное, а не создавать еще один список для избранного раздела. То, что я написал здесь, - это автономный тест, который вы можете выполнить, и ключевым моментом является свойство where, которое:

    List<Epi> episode=[some data]
    epsode.where((Epi episode)=>episode.isFavorite).toList();

Вы можете использовать этот метод даже после развертывания приложения в облачной базе данных, создав этот атрибут в своей базе данных на основе идентификатора пользователя.

0
Dharman 12 Окт 2020 в 08:20