Как определить переменную для виджета checkbox, ограниченного самим экземпляром?

#flutter #variables #dart #arraylist #stateful

#flutter #переменные #dart #arraylist #с сохранением состояния

Вопрос:

 class MemberList extends StatefulWidget {
  @override
    _MemberListState createState() => _MemberListState();
}

class _MemberListState extends State<MemberList> {
  @override
  Widget build(BuildContext context) {

    final members = Provider.of<List<Member>>(context); 
    final presentMembers = new List();
    bool _present = false;

    return ListView.builder(
      scrollDirection: Axis.vertical,
      shrinkWrap: true,
      physics: ClampingScrollPhysics(),
      itemCount: members.length,
      itemBuilder: (context, index){
        return Padding(
          padding: EdgeInsets.only(top: 8.0),
          child: Card(
            color: Colors.white,
            margin: EdgeInsets.fromLTRB(20.0, 6.0, 20.0, 0),
            child: ListTile(
              contentPadding: EdgeInsets.symmetric(horizontal: 20.0),
              title: Text(members[index].name,style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold),),
              trailing: Checkbox(
                value:  members[index] != null,
                onChanged: (bool value) {
                  setState(() {
                    _present = value;
                  });
                  if(_present == true){
                  presentMembers.add(members[index].name);
                  }else{presentMembers.remove(members[index].name);}
                },
                activeColor: Colors.black,
              ),
            ),
          ),
        );
      }
    );
  }
}
  

В приведенном выше коде, если вы видите, что ‘_present’ создается повторно. Я хочу, чтобы эта переменная была ограничена только этим экземпляром. Поскольку с этим кодом происходит то, что всякий раз, когда я устанавливаю флажок, он снимается в течение нескольких секунд, потому что значение той же переменной в другом экземпляре по-прежнему равно false. Моя конечная цель — получить динамический список присутствующих участников, созданный путем установки флажка. Я надеюсь, что вопрос будет ясен.:))

Ответ №1:

Вы должны поместить свои переменные внутри класса State, но вне метода build, вот так:

 class MemberList extends StatefulWidget {
  @override
    _MemberListState createState() => _MemberListState();
}

class _MemberListState extends State<MemberList> {
  bool _present = false;

  @override
  Widget build(BuildContext context) {

    final members = Provider.of<List<Member>>(context); 
    final presentMembers = new List();
    
    return ListView.builder(
      scrollDirection: Axis.vertical,
      shrinkWrap: true,
      physics: ClampingScrollPhysics(),
      itemCount: members.length,
      itemBuilder: (context, index){
        return Padding(
          padding: EdgeInsets.only(top: 8.0),
          child: Card(
            color: Colors.white,
            margin: EdgeInsets.fromLTRB(20.0, 6.0, 20.0, 0),
            child: ListTile(
              contentPadding: EdgeInsets.symmetric(horizontal: 20.0),
              title: Text(members[index].name,style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold),),
              trailing: Checkbox(
                value:  members[index] != null,
                onChanged: (bool value) {
                  setState(() {
                    _present = value;
                  });
                  if(_present == true){
                  presentMembers.add(members[index].name);
                  }else{presentMembers.remove(members[index].name);}
                },
                activeColor: Colors.black,
              ),
            ),
          ),
        );
      }
    );
  }
}
  

Комментарии:

1. Но проблема в том, что когда я ставлю галочку в любом поле из списка, все флажки становятся помеченными. Как и любое изменение, которое я делаю для любого из флажков, то же самое реплицируется в остальных.

2. Если это все еще не проясняет, не стесняйтесь сообщить мне здесь.

3. Вам нужно предоставить уникальный ключевой параметр для каждой ячейки listview. Для этого вы можете использовать объект uniqueKey.