【问题标题】:selecting a single checkbox selects all the other checkboxes - flutter选择一个复选框会选择所有其他复选框 - 颤动
【发布时间】:2020-10-02 22:27:57
【问题描述】:

我是新来的颤振。当我尝试在 ListView.builder 中选择一张卡片时,我列表中的所有其他卡片都会被选中。

我知道这是索引问题。但是,我正在使用索引来获取从数据库中获取的数据列表。因此,itembuilder 中的索引是 int 而不是 bool。

我的代码

                shrinkWrap: true,
                itemCount: snapshot.data.length,
                itemBuilder: (context, index) {
                  ServiceProvider serviceProvider = snapshot.data[index];
                  return new Card(
                    shape: selected
                        ? new RoundedRectangleBorder(
                        side: new BorderSide(color: Colors.blue, width: 2.0),
                        borderRadius: BorderRadius.circular(4.0))
                        : new RoundedRectangleBorder(
                        side: new BorderSide(color: Colors.white, width: 2.0),
                        borderRadius: BorderRadius.circular(4.0)),
                    child: new Padding(
                      padding: const EdgeInsets.all(5.0),
                      child: new Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          new Text(serviceProvider.name, style: TextStyle(fontSize: 20, height: 1.5)),
                          new Text(serviceProvider.serviceType, style: TextStyle(fontSize: 15, height: 1.5),),
                          new Text(serviceProvider.phoneNumber, style: TextStyle(fontSize: 15, height: 1.5),),
                          new Text(serviceProvider.address, style: TextStyle(fontSize: 15, height: 1.5),),
                          new Text(serviceProvider.location, style: TextStyle(fontSize: 15, height: 1.5),),
                          new Text(serviceProvider.emailAddress, style: TextStyle(fontSize: 15, height: 1.5),),
                          Container(
                            child: ButtonBar(
                              children: <Widget>[
                                new Checkbox(
                                    value: selected,
                                    onChanged: (value) {
                                      setState(() {
                                        selected = value;
                                        print(selected);
                                      });
                                      selectedName.add(serviceProvider.name);
                                      print(selectedName);
                                    }),
                                new RaisedButton(
                                  child: Text('Discard'),
                                  onPressed: () {
                                    setState(() {
                                      deleteMethod(serviceProvider.name);
                                    });
                                  },
                                ),
                                new RaisedButton(
                                  child: Text('Verified'),
                                  onPressed: () {
                                    setState(() {
                                      updateMethod(serviceProvider.name);
                                    });
                                  },
                                ),
                              ],
                            ),
                          )
                        ],
                      ),
                    ),
                  );
                },
              );```

How do i go about this?

【问题讨论】:

  • 我认为问题出在`new Checkbox(value: selected`你为所有孩子设置相同的值。
  • 另外,当你已经拥有value: selected 时,selected = value; 没有做任何事情。

标签: flutter


【解决方案1】:

保留所选对象的Set(在您的情况下,ServiceProviders,假设它们的 hashCode 和 equals 被正确覆盖,您可以在 IntelliJ/Android Studio 中通过 alt-inserting 来完成)。然后您可以查看该集合是否包含一个对象(以确定它是否被选中)、删除一个对象(以删除选择)或添加一个对象(以选择)。

为此,请将以下内容放在 State 类的顶部:

final selectedServiceProviders = Set<ServiceProvider>(); // creates an empty set (nothing selected by default)

然后,在你使用setState改变selected布尔值的地方,只需使用setState用第一段中描述的相应方法(add()remove())修改selectedServiceProviders )。检查对象是否被选中,可以调用selectedServiceProviders.contains(object);

【讨论】:

  • 很抱歉,我没弄好。你能给我详细一点吗?谢谢!
  • 没问题。如果您认为这是正确的答案,请确保将其设置为接受的答案。
猜你喜欢
  • 2018-12-19
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
相关资源
最近更新 更多