#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.