这可能只是一个小错误,但我的回调无法正常工作。我正在尝试使用回调删除Listview项,但是当我按下图标按钮时,什么也没有发生。我写了一个示例代码,因为我的代码太长。
我正在UserListView
中构建listView,并将数据传递到User
小部件。
class UserListView extends StatefulWidget {
@override
_UserListViewState createState() => _UserListViewState();
}
class _UserListViewState extends State<UserListView> {
List<User> user = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("User")),
body: StreamBuilder<QuerySnapshot>(
stream: userRef.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Text("something happend");
}
user = snapshot.data.documents
.map((doc) => User.fromDocument(doc))
.toList();
if (user.isEmpty) {
return Text("no user");
}
return ListView.builder(
itemCount: user.length,
itemBuilder: (BuildContext context, int index) {
final item = user[index];
return User(
index: item.index,
username: item.username,
uid: item.uid,
country: item.country,
removeUser: () {
setState(() {
user.removeAt(item.index);
});
},
);
},
);
}));
}
}
在User
中,我试图调用函数removeUser
,但什么也没有发生。
class User extends StatefulWidget {
final int index;
final String username;
final String uid;
final String country;
final VoidCallback removeUser;
User({this.username, this.country, this.uid, this.index, this.removeUser});
factory User.fromDocument(DocumentSnapshot doc) {
return User(
uid: doc['uid'],
username: doc['username'],
country: doc['country'],
);
}
@override
_UserState createState() => _UserState();
}
class _UserState extends State<User> {
@override
Widget build(BuildContext context) {
return Container(
height: 200.0,
child: Column(
children: <Widget>[
Text(widget.uid),
Text(widget.username),
Text(widget.country),
IconButton(
icon: Icon(Icons.delete),
onPressed: () => widget.removeUser(),
)
],
),
);
}
}
我在使用回调“ removeUser”时会丢失什么?
您误删除了用于删除项目的索引。
在您的代码中,您正在为列表中的每个项目分配索引,并尝试使用列表中的该预分配索引动态地从列表中删除该项目。
那么,如何正确地从列表中删除项目?
使用单击位置而不是存储在您自己的对象中的静态索引值。
所以,替换这个
setState(() {
user.removeAt(item.index);
});
with
setState(() {
user.removeAt(index);
});