扑。检查列表是否新的项目标题已经存在。如果没有将项目添加到列表中
Flutter. Check list if the new item title already exist. If not add the item to the list
我有一个 Flutter 网站,其中有一个歌曲列表。用户可以将歌曲添加到列表中,我想实现在用户添加新歌曲后检查列表是否歌曲已经存在。如果它已经存在,那么现有项目的喜欢 属性 会增加。如果它不存在,则添加该项目。
我用 list.contains(item.title) 试过了,但它不能正常工作。
这是我的代码:
class _songlistState extends State<SonglistView> {
TextEditingController textfieldControllersong;
List<Song> list = List<Song>();
@override
void initState() {
textfieldControllersong = TextEditingController();
super.initState();
}
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
Expanded(child: SizedBox(height: 400.0, child: buildListView())),
Expanded(
child: Center(
child: TextField(
cursorColor: primaryColor,
decoration: new InputDecoration(
hintText: 'Enter your Song',
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
),
controller: textfieldControllersong,
),
),
),
SizedBox(
width: 20,
),
FloatingActionButton(
child: const Icon(Icons.add),
backgroundColor: primaryColor,
onPressed: () {
print('hallo');
checkSong(Song(
title: textfieldControllersong.text, like: false, likes: 0));
/*addSong(Song(
title: textfieldControllersong.text, like: false, likes: 0));*/
},
)
],
);
}
Widget buildListView() {
return ListView.builder(
itemCount: list.length,
itemBuilder: (context, index) {
return buildItem(list[index]);
},
);
}
Widget buildItem(Song item) {
return Card(
child: ListTile(
title: Text(item.title),
subtitle: Text('${item.likes}'),
trailing: Icon(
item.like ? Icons.favorite : Icons.favorite_border,
color: item.like ? Colors.red : null,
),
//trailing: Checkbox(value: item.like, onChanged: null),
onTap: () {
setCompletness(item);
},
),
);
}
void addSong(Song item) {
setState(() {
list.add(item);
});
}
void setCompletness(Song item) {
setState(() {
item.like = !item.like;
});
item.like ? item.likes++ : item.likes--;
}
void checkSong(Song item) {
if (list.contains(item)) {
item.likes += 1;
} else {
addSong(Song(title: textfieldControllersong.text, like: false, likes: 0));
}
}
}```
这里是比较两者objects可能歌曲1和歌曲2有space的不同所以你可以迭代歌曲列表,只比较标题或歌曲名称
bool isSongFound = false;
list.forEach((s){
if(s.title.trim() == item.title.trim()){
isSongFound=true;
}
});
if(isSongFound){
item.likes += 1;
}
else{
addSong(Song(title: textfieldControllersong.text, like: false, likes: 0));
}
好的,我自己解决了这个问题。我试图从错误的歌曲 ups 中增加喜欢,初学者错误。无论如何,这是完成的代码。
void checkSong(Song item) {
bool isSongFound = false;
list.forEach((s) {
if (s.title.trim() == item.title.trim()) {
setState(() {
s.likes++;
});
isSongFound = true;
}
});
if (!isSongFound) {
addSong(Song(title: textfieldControllersong.text, like: false, likes: 0));
}
}
我有一个 Flutter 网站,其中有一个歌曲列表。用户可以将歌曲添加到列表中,我想实现在用户添加新歌曲后检查列表是否歌曲已经存在。如果它已经存在,那么现有项目的喜欢 属性 会增加。如果它不存在,则添加该项目。
我用 list.contains(item.title) 试过了,但它不能正常工作。
这是我的代码:
class _songlistState extends State<SonglistView> {
TextEditingController textfieldControllersong;
List<Song> list = List<Song>();
@override
void initState() {
textfieldControllersong = TextEditingController();
super.initState();
}
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
Expanded(child: SizedBox(height: 400.0, child: buildListView())),
Expanded(
child: Center(
child: TextField(
cursorColor: primaryColor,
decoration: new InputDecoration(
hintText: 'Enter your Song',
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
),
controller: textfieldControllersong,
),
),
),
SizedBox(
width: 20,
),
FloatingActionButton(
child: const Icon(Icons.add),
backgroundColor: primaryColor,
onPressed: () {
print('hallo');
checkSong(Song(
title: textfieldControllersong.text, like: false, likes: 0));
/*addSong(Song(
title: textfieldControllersong.text, like: false, likes: 0));*/
},
)
],
);
}
Widget buildListView() {
return ListView.builder(
itemCount: list.length,
itemBuilder: (context, index) {
return buildItem(list[index]);
},
);
}
Widget buildItem(Song item) {
return Card(
child: ListTile(
title: Text(item.title),
subtitle: Text('${item.likes}'),
trailing: Icon(
item.like ? Icons.favorite : Icons.favorite_border,
color: item.like ? Colors.red : null,
),
//trailing: Checkbox(value: item.like, onChanged: null),
onTap: () {
setCompletness(item);
},
),
);
}
void addSong(Song item) {
setState(() {
list.add(item);
});
}
void setCompletness(Song item) {
setState(() {
item.like = !item.like;
});
item.like ? item.likes++ : item.likes--;
}
void checkSong(Song item) {
if (list.contains(item)) {
item.likes += 1;
} else {
addSong(Song(title: textfieldControllersong.text, like: false, likes: 0));
}
}
}```
这里是比较两者objects可能歌曲1和歌曲2有space的不同所以你可以迭代歌曲列表,只比较标题或歌曲名称
bool isSongFound = false;
list.forEach((s){
if(s.title.trim() == item.title.trim()){
isSongFound=true;
}
});
if(isSongFound){
item.likes += 1;
}
else{
addSong(Song(title: textfieldControllersong.text, like: false, likes: 0));
}
好的,我自己解决了这个问题。我试图从错误的歌曲 ups 中增加喜欢,初学者错误。无论如何,这是完成的代码。
void checkSong(Song item) {
bool isSongFound = false;
list.forEach((s) {
if (s.title.trim() == item.title.trim()) {
setState(() {
s.likes++;
});
isSongFound = true;
}
});
if (!isSongFound) {
addSong(Song(title: textfieldControllersong.text, like: false, likes: 0));
}
}