listview - 使用回调删除 ListView 项的Flutter/Dart Issue

标签 listview flutter dart callback

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

最佳答案

如下更改代码:

import 'package:flutter/material.dart';

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) {
                  return Container(
                    height: 200.0,
                    child: Column(
                      children: <Widget>[
                        Text(user[index].uid),
                        Text(user[index].username),
                        Text(user[index].country),
                        IconButton(
                            icon: Icon(Icons.delete),
                            onPressed: () => setState(() {
                                  user.removeAt(index);
                                }))
                      ],
                    ),
                  );
                },
              );
            }));
  }
}

class User {
  final String username;
  final String uid;
  final String country;

  User({this.username, this.uid, this.country});

  factory User.fromDocument(DocumentSnapshot doc) {
    return User(
        username: doc['username'], uid: doc['uid'], country: doc['country']);
  }
}

您不需要不必要地创建StatefulWidget类。只需创建List类型的用户的User即可。

另外,您需要将StreamBuilder从build方法移动到其他方法,并在streambuilder为null的情况下对user方法实现条件调用。

更新的解决方案:
import 'package:flutter/material.dart';

class UserListView extends StatefulWidget {
  @override
  _UserListViewState createState() => _UserListViewState();
}

class _UserListViewState extends State<UserListView> {
  static List<User> user = [];

  Widget _commonPart() {
    return ListView.builder(
      itemCount: user.length,
      itemBuilder: (BuildContext context, int index) {
        return Container(
          height: 200.0,
          child: Column(
            children: <Widget>[
              Text(user[index].uid),
              Text(user[index].username),
              Text(user[index].country),
              IconButton(
                  icon: Icon(Icons.delete),
                  onPressed: () => setState(() {
                        user.removeAt(index);
                      }))
            ],
          ),
        );
      },
    );
  }

  Widget _buildBody() {
    if (user == null) {
      // since the list is empty, fetch the data

      return 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");
            } else {
              return _commonPart();
            }
          });
    } else {
      return _commonPart();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text("User")), body: _buildBody());
  }
}

class User {
  final String username;
  final String uid;
  final String country;

  User({this.username, this.uid, this.country});

  factory User.fromDocument(DocumentSnapshot doc) {
    return User(
        username: doc['username'], uid: doc['uid'], country: doc['country']);
  }
}

关于listview - 使用回调删除 ListView 项的Flutter/Dart Issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59320286/

相关文章:

android - Android 中错误的复选框选择?

android - 单击进入聊天室时应用程序崩溃

java - 数字 EditText 暂时显示文本键盘(输入连接无效)

android - ListView 上的 setEmptyView 不起作用

android - Firebase未添加实时数据

flutter - FutureBuilder 方法 'findRenderObject' 被调用为 null

dart - 节点,子节点,追加新元素

Flutter - 遍历异步/ future 列表

flutter/Dart : How do I raise the location of a FAB when using extendBody: true on a Scaffold?

dart - flutter :AutomaticKeepAliveClientMixin 不适用于 BottomNavigationBar