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