Hive 中的 Flutter 离线数据更改,ListView UI 在数据更改时不更新

问题描述

//----- 当 Hive DB 中的产品数量增加或减少时,我试图刷新 UI-----//

//--------------我的HIVE课---------------------------/ /

@HiveType(typeId: 0)
class ProductDBModel extends HiveObject{
  @HiveField(0)
  int id;
  @HiveField(1)
  String productName;
  @HiveField(2)
  String image;
  @HiveField(3)
  int price;
  @HiveField(4)
  String description;
  @HiveField(5)
  int quantity;

  ProductDBModel(this.id,this.productName,this.image,this.price,this.description,this.quantity);
 
}

//-------------------我的购物车类我正在使用流构建器----------------- ---------//

class CartScreen extends StatefulWidget {
  @override
  _CartScreenState createState() => _CartScreenState();
}

class _CartScreenState extends State<CartScreen> {
  Future<List> stream;

  @override
  void initState() {
    super.initState();
    stream = _openBoxgetList();
  }

  Future<List<ProductDBModel>> _openBoxgetList() async {
      Box hive_prod_Box = await Hive.openBox<ProductDBModel>(ProductTable);
       List rawFavouriteList = await hive_prod_Box.values.toList();
       return rawFavouriteList;
  }

  @override
  Widget build(BuildContext context) {  

    return StreamBuilder<List<ProductDBModel>>(
        stream: stream.asstream(),builder: (context,AsyncSnapshot snapshot) {
          if (!snapshot.hasData) {
            return Container(child: Center(child: CircularProgressIndicator()));
          }
          else if(snapshot.hasError){
            return Scaffold(body: Text('Error Occured while loading cart'),);
          }
          else
          {
            if(snapshot.data.length == 0){
              Hive.deleteFromdisk();
              return ShowEmptyCart();
            }
            else{
              return
                Scaffold(                 
                  body: Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 8.0),child: ListView.builder(
                          physics: ScrollPhysics(),shrinkWrap: true,itemCount: snapshot.data.length,itemBuilder: (context,index) {
                          
                            return dismissible(
                              background: Container(color: Colors.red),key: UniqueKey(),ondismissed: (direction) {
                                snapshot.data[index].delete();
                              },child: CartItem(snapshot.data[index],index),);
                          },),);
            }

          }
        });

  }

}

//-------------------购物车项目类更新产品数量-----------------//

class CartItem extends StatefulWidget {
  ProductDBModel prod_;
  int index;    
  CartItem(ProductDBModel this.prod_,this.index);    
  @override
  _CartItemState createState() => _CartItemState();
}

class _CartItemState extends State<CartItem> {
  CartScreen _cartScreen = new CartScreen();
  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 2,child: Padding(
        padding: const EdgeInsets.symmetric(vertical: 5.0),child: Container(
          height: 150.0,child: Row(
            crossAxisAlignment: CrossAxisAlignment.start,children: [
              Padding(
                    padding: const EdgeInsets.only(left: 10.0),Container(
                          decoration: Boxdecoration(
                            color: grey_background,borderRadius: BorderRadius.circular(12),child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceAround,children: [
                              InkWell(
                                child: Padding(
                                  padding: const EdgeInsets.fromLTRB(8.0,5.0,8.0,5.0),child: TextOnlyFont14(
                                      '-',Colors.black,FontWeight.w600),onTap: () {
                                  CheckUpdate(widget.prod_,widget.index,"dec",context);
                                },TextOnlyFont14(widget.prod_.quantity.toString(),InkWell(
                                child: Padding(
                                  padding: const EdgeInsets.fromLTRB(8.0,child: TextOnlyFont14(
                                      '+',"inc",],);
  }

  Future<void> CheckUpdate(ProductDBModel product,int index_,String inc_dec,BuildContext context) async {
    Box prodBox = await Hive.openBox<ProductDBModel>(ProductTable);

    final modelExists = prodBox.containsKey(product.key);

    if (!modelExists) {
      product.quantity = 1;
      await prodBox.add(product);
    } else {
      if (equalsIgnoreCase(inc_dec,"inc")) {
        product.quantity += 1;
      } else if(equalsIgnoreCase(inc_dec,"dec")) {
        if (product.quantity == 1) {
        } else {
          product.quantity -= 1;
        }
      }
      else if(equalsIgnoreCase(inc_dec,"del")) {
        product.delete();
      }
      product.save();
    }

  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)