You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用Cubit+Hive时出现类型转换错误:'String' is not a subtype of type 'int' in type cast

Flutter中使用Cubit+Hive时出现类型转换错误:'String' is not a subtype of type 'int' in type cast

问题分析

我帮你排查了代码和报错栈追踪,发现这个类型转换错误的核心原因是Hive的CartAdapter中读写数据的顺序不匹配,导致从Hive读取数据时,本该是<String, int>类型的Map被错误地读取成了<String, String>类型的Map,进而触发了String转int的类型转换失败。

具体细节:

  1. 你的CartHive构造函数参数顺序是:
    CartHive(
      this.storeNameCounterperProduct, // 第一个参数:<String, int> 商品数量Map
      this.storeNamePriceperProduct,   // 第二个参数:<String, String> 商品价格Map
      this.prodsCountPerStore,         // 第三个参数:<String, int> 店铺商品总数Map
    );
    
  2. 但在CartAdapter的write方法中,你写入Hive的顺序完全搞反了:
    writer
      ..writeMap(obj.storeNamePriceperProduct) // 先写价格Map(<String,String>)
      ..writeMap(obj.storeNameCounterperProduct) // 再写数量Map(<String,int>)
      ..writeMap(obj.prodsCountPerStore);
    
  3. 而read方法是按照构造函数的顺序读取的,这就导致:本该读取<String, int>类型的数量Map,实际读出来的却是<String, String>类型的价格Map,当你尝试cast<String, int>时,价格字符串无法转换成int,直接触发了报错。

解决方案

修正CartAdapter的write方法,让数据写入顺序严格和CartHive构造函数的参数顺序保持一致:

class CartAdapter extends TypeAdapter<CartHive> {
  @override
  CartHive read(BinaryReader reader) {
    return CartHive(
      (reader.readMap()).cast<String, int>(),
      (reader.readMap()).cast<String, String>(),
      (reader.readMap()).cast<String, int>(),
    );
  }

  @override
  int get typeId => 1;

  @override
  void write(BinaryWriter writer, CartHive obj) {
    writer
      // 严格匹配构造函数顺序:先写数量Map,再写价格Map,最后写店铺商品总数Map
      ..writeMap(obj.storeNameCounterperProduct)
      ..writeMap(obj.storeNamePriceperProduct)
      ..writeMap(obj.prodsCountPerStore);
  }
}

额外注意事项

  • 如果你之前已经在设备上存储了顺序错误的旧数据,建议清除应用本地数据或者主动删除旧的cartBox,因为之前存储的数据结构已经错乱,直接修改Adapter后读取旧数据仍然会有问题。测试时可以临时添加以下代码清除旧数据:
    // 仅测试阶段使用,上线前务必移除
    if (Hive.isBoxOpen('cartBox')) {
      await Hive.box('cartBox').deleteFromDisk();
    }
    
  • Hive的TypeAdapter对读写顺序要求极高,所有字段的读写顺序必须和构造函数参数顺序完全对应,否则必然会出现数据类型错位或读取异常。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:03:05