扑。检查列表是否新的项目标题已经存在。如果没有将项目添加到列表中

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));
    }
  }