如何解决当删除需要回来查看更改时,小部件中的颤动项目未更新
我有一个简单的购物车页面,我在购物车页面上显示产品。问题是当我删除它正在删除的项目但在小部件中时,它没有删除我需要返回并再次显示更改。我也尝试提升 setState 但不起作用。
我的代码
class _CartPageState extends State<CartPage> {
num amount = 0;
bool checkLogin = false;
void navigatetoAddresspage() {
Get.to(Addresspage());
}
check() async {
final storage = new FlutterSecureStorage();
String imi = await storage.read(key: "imei");
print(imi);
if (imi == "loginhuavaha") {
setState(() {
this._query();
checkLogin = true;
});
}
}
@override
void initState() {
setState(() {
this.check();
});
}
List<Widget> textWidgetList = List<Widget>();
void _query() async {
print('cart');
final dbHelper = DatabaseHelper.instance;
final allRows = await dbHelper.queryAllRows();
allRows.forEach((row) {
amount += double.parse(row['price']);
print(amount);
print(row);
});
for (int i = 0; i < allRows.length; i++) {
textWidgetList.add(Card(
elevation: 5.0,shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0),),margin: EdgeInsets.symmetric(vertical: 8.0),child: Container(
width: double.infinity,height: 120.0,padding: EdgeInsets.all(12.0),child: Row(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(12.0),child: Image.network(allRows[i]['image'],width: 100,height: 100)),SizedBox(width: 12.0),Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,crossAxisAlignment: CrossAxisAlignment.start,children: [
Expanded(
child: Text(
allRows[i]['title'],textAlign: TextAlign.start,maxLines: 3,overflow: TextOverflow.ellipsis,SizedBox(width: 5.0),Row(
children: [
GestureDetector(
onTap: () async {
print('delete');
final id = await dbHelper.queryRowCount();
print(id);
final rowsDeleted = await dbHelper.delete(
id,allRows[i]['id']);
print('deleted $rowsDeleted row(s): row $id');
setState(() {
});
},child: Icon(
FlutterIcons.delete_outline_mco,)
],)
],Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
Expanded(
child: Text(
allRows[i]['price'],// Counter(),],)
],));
}
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: buildAppBar(context),body: checkLogin
? Container(
child: SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 18.0),child: Column(
crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
Column(children: textWidgetList),)
: Center(
child: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [
Container(child: Text('Your are not login')),SizedBox(height: 10),SizedBox(
width: 85.0,height: 50.0,child: RaisedButton(
color: Theme.of(context).primaryColor,elevation: 0.0,shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),child: Text(
'LOGIN',style: Theme.of(context).textTheme.button,).tr(),onpressed: () {
Get.offAll(SignInPage());
},])),);
}
你可以看到我在我的代码中添加了一条评论我删除了产品,它实际上从数据库中删除了但状态没有改变小部件-_-
解决方法
我认为您在这里需要的是 Provider 包。 Provider 使状态管理变得更加容易。只需定义一个扩展 ChangeNotifier 的模型类,然后使用 ChangeNotifierProvider
首先,您需要将 textWidgetList 放在 setState 中,因为我猜您要操作这些小部件。其次,由于 Flutter 如何处理 UI 上列表中的元素,您必须为这些小部件放置一个键。
查看此页面 https://medium.com/flutter/keys-what-are-they-good-for-13cb51742e7d
简单的人 一旦物品被移除 使用 setState((){})
setState(() {
//在setState里面清除所有行列表
allrows.clear();
//然后再次获取所有行,这样删除的数据就不会显示
allRows = 等待 dbHelper.queryAllRows();
});
setState 重建您的小部件
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。