【问题标题】:Flutter. Check list if the new item title already exist. If not add the item to the list扑。如果新项目标题已经存在,请检查列表。如果不将该项目添加到列表中
【发布时间】:2021-04-25 13:22:49
【问题描述】:

我有一个 Flutter 网站,其中有一个包含歌曲的列表。用户可以将歌曲添加到列表中,我想实现在用户添加新歌曲后,如果歌曲已经存在,则会检查列表。如果它已经存在,则增加现有项目的 likes 属性。如果它不存在,则添加该项目。

我用 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));
    }
  }
}```

【问题讨论】:

    标签: flutter listview add flutter-web


    【解决方案1】:

    在这里您正在比较两个对象,可能会发生歌曲 1 和歌曲 2 中存在 空格 的差异,因此您可以迭代歌曲列表并仅比较标题或歌曲名称

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

    【讨论】:

    • 感谢您的回答!该项目未添加,因此比较有效。但如果 isSongFound 是真的 item.likes +=1 不起作用。也许我必须确切地说应该从哪首歌增加喜欢。但另一方面,我给函数提供了确切的歌曲
    • 您可以为答案投票,但这不是有效的,请检查您正在比较的歌曲的两个实例,修剪文本字段输入是一个好习惯,因为单个空格会造成混乱。是的,你必须做 setState 我猜想反映到 UI 中,查看它并让我知道是否仍然存在任何错误
    • 为什么没有效率?我已经尝试将它设置为这样的设置状态: if (isSongFound) { setState(() { item.likes++; });但这也不起作用,我可以编译它而不会出现任何错误,但是添加一首具有相同标题的歌曲后,相似值确实会增加。
    • 效率不高,因为您每次都在使用要匹配的单个标题迭代歌曲列表。
    • 感谢您的帮助!
    【解决方案2】:

    好的,我自己解决了这个问题。我试图从错误的歌曲 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));
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-12
      • 2022-09-30
      • 2017-01-31
      • 2021-11-04
      • 1970-01-01
      • 2021-07-02
      • 2017-12-23
      • 1970-01-01
      相关资源
      最近更新 更多