Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用回调删除listview项的颤振/省道问题_Listview_Flutter_Dart_Callback - Fatal编程技术网

使用回调删除listview项的颤振/省道问题

使用回调删除listview项的颤振/省道问题,listview,flutter,dart,callback,Listview,Flutter,Dart,Callback,这可能只是一个小错误,但我的回调不起作用。 我试图使用回调删除Listview项,但当我按下图标按钮时,什么也没有发生。 我已经编写了一个示例代码,因为我的代码太长了 我正在UserListView中构建列表视图,并将数据传递给User小部件 class UserListView extends StatefulWidget { @override _UserListViewState createState() => _UserListViewState(); } class

这可能只是一个小错误,但我的回调不起作用。 我试图使用回调删除Listview项,但当我按下图标按钮时,什么也没有发生。 我已经编写了一个示例代码,因为我的代码太长了

我正在
UserListView
中构建列表视图,并将数据传递给
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);
                      });
                    },
                  );
                },
              );
            }));
  }
}

使用回调“removeUser”在这里缺少什么?

您在用于删除项目的索引方面犯了错误。

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

如何从列表中正确删除项目? 使用单击的位置,而不是存储在自己对象中的静态索引值

那么,换掉这个

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

有关完整的工作示例,请参见下面的代码 此示例应用程序显示项目列表,并允许用户从列表中的任何位置删除单击的项目

 import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // Define the default brightness and colors.
        brightness: Brightness.light,
        primaryColorLight: Colors.blue[600],
        accentColor: Colors.blueAccent,
      ),
      debugShowCheckedModeBanner: false,
      home: UserListView(),
    ),
  );
}
class UserListView extends StatefulWidget {
  @override
  _UserListViewState createState() => _UserListViewState();
}

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



  @override
  void initState() {
    super.initState();
     user.add(User(username: "someone1",uid: "1",country: "country",index: 1,removeUser: null,));
user.add(User(username: "someone2",uid: "1",country: "country",index: 2,removeUser: null,));
user.add(User(username: "someone3",uid: "1",country: "country",index: 3,removeUser: null,));
user.add(User(username: "someone4",uid: "1",country: "country",index: 4,removeUser: null,));
user.add(User(username: "someone5",uid: "1",country: "country",index: 5,removeUser: null,));
user.add(User(username: "someone6",uid: "1",country: "country",index: 6,removeUser: null,));


  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text("User")),
        body: 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(index);
            });
          },
        );
      },
    ));
  }
}


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(),
          )
        ],
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(
材料聚丙烯(
标题:“颤振演示”,
主题:主题数据(
//定义默认亮度和颜色。
亮度:亮度,亮度,
primaryColorLight:颜色。蓝色[600],
accentColor:Colors.blueAccent,
),
debugShowCheckedModeBanner:false,
主页:UserListView(),
),
);
}
类UserListView扩展了StatefulWidget{
@凌驾
_UserListViewState createState()=>\u UserListViewState();
}
类_UserListViewState扩展状态{
列表用户=[];
@凌驾
void initState(){
super.initState();
添加(用户(用户名:“someone1”,uid:“1”,国家:“country”,索引:1,移除用户:null,);
添加(用户(用户名:“someone2”,uid:“1”,国家:“country”,索引:2,移除用户:null,);
添加(用户(用户名:“someone3”,uid:“1”,国家:“country”,索引:3,移除用户:null,);
添加(用户(用户名:“someone4”,uid:“1”,国家:“country”,索引:4,移除用户:null,);
添加(用户(用户名:“someone5”,uid:“1”,国家:“country”,索引:5,移除用户:null,);
添加(用户(用户名:“someone6”,uid:“1”,国家:“country”,索引:6,移除用户:null,);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“用户”)),
正文:ListView.builder(
itemCount:user.length,
itemBuilder:(构建上下文,int索引){
最终项目=用户[索引];
返回用户(
索引:item.index,
用户名:item.username,
uid:item.uid,
国家:item.country,
removeUser:(){
设置状态(){
user.removeAt(索引);
});
},
);
},
));
}
}
类用户扩展StatefulWidget{
最终整数指数;
最终字符串用户名;
最后一个字符串uid;
最终字符串国家;
最终用户撤销;
用户({this.username,this.country,this.uid,this.index,this.removeUser});
/*工厂用户.fromDocument(DocumentSnapshot文档){
返回用户(
uid:doc['uid'],
用户名:doc['username'],
国家:doc[“国家”],
);
}*/
@凌驾
_UserState createState()=>\u UserState();
}
类_UserState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回容器(
高度:200.0,
子:列(
儿童:[
文本(widget.uid),
文本(widget.username),
文本(widget.country),
图标按钮(
图标:图标(Icons.delete),
onPressed:()=>widget.removeUser(),
)
],
),
);
}
}

您在用于删除项目的索引方面出错。

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

如何从列表中正确删除项目? 使用单击的位置,而不是存储在自己对象中的静态索引值

那么,换掉这个

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

有关完整的工作示例,请参见下面的代码 此示例应用程序显示项目列表,并允许用户从列表中的任何位置删除单击的项目

 import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // Define the default brightness and colors.
        brightness: Brightness.light,
        primaryColorLight: Colors.blue[600],
        accentColor: Colors.blueAccent,
      ),
      debugShowCheckedModeBanner: false,
      home: UserListView(),
    ),
  );
}
class UserListView extends StatefulWidget {
  @override
  _UserListViewState createState() => _UserListViewState();
}

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



  @override
  void initState() {
    super.initState();
     user.add(User(username: "someone1",uid: "1",country: "country",index: 1,removeUser: null,));
user.add(User(username: "someone2",uid: "1",country: "country",index: 2,removeUser: null,));
user.add(User(username: "someone3",uid: "1",country: "country",index: 3,removeUser: null,));
user.add(User(username: "someone4",uid: "1",country: "country",index: 4,removeUser: null,));
user.add(User(username: "someone5",uid: "1",country: "country",index: 5,removeUser: null,));
user.add(User(username: "someone6",uid: "1",country: "country",index: 6,removeUser: null,));


  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text("User")),
        body: 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(index);
            });
          },
        );
      },
    ));
  }
}


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(),
          )
        ],
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(
材料聚丙烯(
标题:“颤振演示”,
主题:主题数据(
//定义默认亮度和颜色。
亮度:亮度,亮度,
primaryColorLight:颜色。蓝色[600],
accentColor:Colors.blueAccent,
),
debugShowCheckedModeBanner:false,
主页:UserListView(),
),
);
}
类UserListView扩展了StatefulWidget{
@凌驾
_UserListViewState createState()=>\u UserListViewState();
}
类_UserListViewState扩展状态{
列表用户=[];
@凌驾
void initState(){
super.initState();
添加(用户(用户名:“someone1”,uid:“1”,国家:“country”,索引:1,移除用户:null,);
添加(用户(用户名:“someone2”,uid:“1”,国家:“country”,索引:2,移除用户:null,);
添加(用户(用户名:“someone3”,uid:“1”,国家:“country”,索引:3,移除用户:null,);
添加(用户(用户名:“someone4”,uid:“1”,国家:“country”,索引:4,移除用户:null,);
添加(用户(用户名:“someone5”,uid:“1”,国家:“country”,索引:5,移除用户:null,);
添加(用户(用户名:“someone6”,uid:“1”,国家:“country”,索引:6,移除用户:null,);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“用户”)),
正文:ListView.builder(
itemCount:user.length,
itemBuilder:(构建上下文,int索引){
最终项目=用户[索引];
返回用户(
索引:item.index,
用户名:item.username,
uid:item.uid,
国家:item.country,
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']);
  }
}
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']);
  }
}