Flutter / Dart Issue使用回调删除列表视图项

问题描述 投票:0回答:1

这可能只是一个小错误,但我的回调无法正常工作。我正在尝试使用回调删除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”时会丢失什么?

listview flutter dart callback
1个回答
0
投票

您误删除了用于删除项目的索引。

在您的代码中,您正在为列表中的每个项目分配索引,并尝试使用列表中的该预分配索引动态地从列表中删除该项目。

那么,如何正确地从列表中删除项目?

使用单击位置而不是存储在您自己的对象中的静态索引值。

所以,替换这个

setState(() {
                    user.removeAt(item.index);
                  });

with

 setState(() {
          user.removeAt(index);
        });
© www.soinside.com 2019 - 2024. All rights reserved.