微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当删除需要回来查看更改时,小部件中的颤动项目未更新

如何解决当删除需要回来查看更改时,小部件中的颤动项目未更新

我有一个简单的购物车页面,我在购物车页面显示产品。问题是当我删除它正在删除的项目但在小部件中时,它没有删除我需要返回并再次显示更改。我也尝试提升 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 包装您的小部件。要访问字段使用 Provider.of(context).var 或 Provider.of(context).function

,

首先,您需要将 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?