Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Flutter Can';从数据库中删除后更新showModalBottomSheet内的ListView_Flutter_Dart - Fatal编程技术网

Flutter Can';从数据库中删除后更新showModalBottomSheet内的ListView

Flutter Can';从数据库中删除后更新showModalBottomSheet内的ListView,flutter,dart,Flutter,Dart,我有一个ModalBottomSheet,里面有一个ListView。ListView连接到sqlite数据库。所有create、read和delete方法都可以正常工作,但是当我删除一个项目时,我会收到toast消息,该消息批准了操作,但我的视图没有得到更新。当我关闭工作表并再次打开时,它会被更新。 我的ModalBottomSheet代码是: void popUpScreen(context) { showModalBottomSheet( context: cont

我有一个ModalBottomSheet,里面有一个ListView。ListView连接到sqlite数据库。所有create、read和delete方法都可以正常工作,但是当我删除一个项目时,我会收到toast消息,该消息批准了操作,但我的视图没有得到更新。当我关闭工作表并再次打开时,它会被更新。 我的ModalBottomSheet代码是:

void popUpScreen(context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Container(
              color: Colors.blue[600],
              height: MediaQuery.of(context).size.height * .8,
              child: ListView.builder(
                  itemCount: _loclist.length,
                  itemBuilder: (context, index) {
                    return Padding(
                        padding: EdgeInsets.only(top: 8, left: 16, right: 16),
                        child: Card(
                          child: ListTile(
                            leading: Text(_loclist[index].name),
                            title: IconButton(
                              icon: Icon(Icons.delete),
                              onPressed: () async {
                                var result = await locationdbservice
                                    .deleteLocation(_loclist[index].id);
                                this._loclist.removeAt(index);
                                if (result > 0) {
                                  Toast.show("Silindi", context,
                                      duration: Toast.LENGTH_SHORT,
                                      gravity: Toast.BOTTOM);
                                  getLocations();
                                }
                              },
                            ),
                          ),
                        ));
                  }));
        });
  }
和getLocations():


链接到项目:

请使用setstate方法检查

void popUpScreen(context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Container(
              color: Colors.blue[600],
              height: MediaQuery.of(context).size.height * .8,
              child: ListView.builder(
                  itemCount: _loclist.length,
                  itemBuilder: (context, index) {
                    return Padding(
                        padding: EdgeInsets.only(top: 8, left: 16, right: 16),
                        child: Card(
                          child: ListTile(
                            leading: Text(_loclist[index].name),
                            title: IconButton(
                              icon: Icon(Icons.delete),
                              onPressed: () async {
                                var result = await locationdbservice
                                    .deleteLocation(_loclist[index].id);
                                setState(() {
                                   this._loclist.removeAt(index); 
                              });
                                
                                if (result > 0) {
                                  Toast.show("Silindi", context,
                                      duration: Toast.LENGTH_SHORT,
                                      gravity: Toast.BOTTOM);
                                  getLocations();
                                }
                              },
                            ),
                          ),
                        ));
                  }));
        });
  }
根据文件:

调用setState会通知框架 此对象的更改方式可能会影响用户界面 在该子树中,这将导致框架为 这个州反对


因此,如果小部件的状态发生变化,您必须调用
setState((){})
触发视图的重建,并立即查看新状态所隐含的更改。

这里我提供了解决方案。在
showmodelboothsheet
中总是出现这样的情况,即它不会重建或更改其状态,因此我遇到了解决方案。在ModelBottomSheet中添加StatefulBuilder,这将更改其状态onPressed函数。另外,您的代码正在抛出异常,所以我处理了这些异常。转到GitHub合并拉取请求并继续

如果此解决方案有帮助,请竖起大拇指

下面是示例代码。我已经实现了这个,只需转到GitHub并开始编码

  void popUpScreen() {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return StatefulBuilder(
              builder: (BuildContext context, StateSetter mystate) {
            return Container(
                color: Colors.blue[600],
                height: MediaQuery.of(context).size.height * .8,
                child: ListView.builder(
                    itemCount: _loclist.length,
                    itemBuilder: (context, index) {
                      return Padding(
                          padding: EdgeInsets.only(top: 8, left: 16, right: 16),
                          child: Card(
                            child: ListTile(
                              leading: Text(_loclist[index].name),
                              title: IconButton(
                                icon: Icon(Icons.delete),
                                onPressed: () async {
                                  var result = await locationdbservice
                                      .deleteLocation(_loclist[index].id);
                                  mystate(() {
                                    this._loclist.removeAt(index);
                                  });
                                  if (result > 0) {
                                    Toast.show("Silindi", context,
                                        duration: Toast.LENGTH_SHORT,
                                        gravity: Toast.BOTTOM);
                                    getLocations();
                                  }
                                  setState(() {});
                                },
                              ),
                            ),
                          ));
                    }));
          });
        });
  }

我试过了,但没用。popUpScreen是函数还是方法?请共享更多代码,下表必须是有状态widget的一部分。如果弹出屏幕是有状态widget的一部分,则setstate方法必须可用。如果您在popUpScreen()中传递了上下文,则从位置按钮中的有状态widget调用了方法,则传递了上下文,并且它是一个小部件。小部件调用SetState时无法重建请删除位置前面的小部件Buttoni拉了它,非常感谢。但我有一个问题,在我拉后,现在当我单击第一个按钮将数据添加到db时,我在我的底页上看不到任何内容。你也是这样吗?哦,对不起,我在setstate漏掉了一行。我已经在GitHub上上传了更改。请务必阅读评论谢谢!找不到更新。评论在哪里?GitHub中有提交,非常感谢您的努力。太棒了!
void popUpScreen(context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Container(
              color: Colors.blue[600],
              height: MediaQuery.of(context).size.height * .8,
              child: ListView.builder(
                  itemCount: _loclist.length,
                  itemBuilder: (context, index) {
                    return Padding(
                        padding: EdgeInsets.only(top: 8, left: 16, right: 16),
                        child: Card(
                          child: ListTile(
                            leading: Text(_loclist[index].name),
                            title: IconButton(
                              icon: Icon(Icons.delete),
                              onPressed: () async {
                                var result = await locationdbservice
                                    .deleteLocation(_loclist[index].id);
                                setState(() {
                                   this._loclist.removeAt(index); 
                              });
                                
                                if (result > 0) {
                                  Toast.show("Silindi", context,
                                      duration: Toast.LENGTH_SHORT,
                                      gravity: Toast.BOTTOM);
                                  getLocations();
                                }
                              },
                            ),
                          ),
                        ));
                  }));
        });
  }
  void popUpScreen() {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return StatefulBuilder(
              builder: (BuildContext context, StateSetter mystate) {
            return Container(
                color: Colors.blue[600],
                height: MediaQuery.of(context).size.height * .8,
                child: ListView.builder(
                    itemCount: _loclist.length,
                    itemBuilder: (context, index) {
                      return Padding(
                          padding: EdgeInsets.only(top: 8, left: 16, right: 16),
                          child: Card(
                            child: ListTile(
                              leading: Text(_loclist[index].name),
                              title: IconButton(
                                icon: Icon(Icons.delete),
                                onPressed: () async {
                                  var result = await locationdbservice
                                      .deleteLocation(_loclist[index].id);
                                  mystate(() {
                                    this._loclist.removeAt(index);
                                  });
                                  if (result > 0) {
                                    Toast.show("Silindi", context,
                                        duration: Toast.LENGTH_SHORT,
                                        gravity: Toast.BOTTOM);
                                    getLocations();
                                  }
                                  setState(() {});
                                },
                              ),
                            ),
                          ));
                    }));
          });
        });
  }