Я пытаюсь разрешить пользователю пометить элемент, создаваемый 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)
)
],
),
),
);
}),
),
],
)
2 ответа
В моем приложении Congress Fahrplan (Github) я делаю именно то, чего вы хотите достичь.
В favourite_provider я сохраняю значение в самом объекте и добавить его в мой список избранных объектов. Каждый раз, когда объект добавляется в этот список, список записывается на диск как JSON с моим file_storage класс.
При перезапуске приложения объекты извлекаются из REST API. Затем я сопоставляю их идентификаторы с объектами из локального JSON и устанавливаю, добавлены ли они в избранное или нет, чтобы восстановить состояние избранного.
Составление списка избранных элементов в основном зависит от дизайна приложения, и вы также можете разработать свою собственную логику для этой цели. Хотя то, что опубликовал @ 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();
Вы можете использовать этот метод даже после развертывания приложения в облачной базе данных, создав этот атрибут в своей базе данных на основе идентификатора пользователя.
Похожие вопросы
Новые вопросы
flutter
Flutter - это набор средств разработки пользовательского интерфейса с открытым исходным кодом, созданный Google. Он используется для разработки приложений для Android, iOS, Linux, Mac, Windows, Google Fuchsia и Интернета из единой кодовой базы. Приложения Flutter написаны на языке Dart.