如何为仅限于该实例的复选框小部件定义变量


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。我的最终目标是通过选中该框来生成一个动态的成员列表。我希望问题会很清楚

您应该将变量放在State类中,但放在构建方法之外,如下所示:

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

最新更新