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

Flutter Hive从Box复制数据到List时触发栈溢出错误

问题根源

你遇到的栈溢出是无限递归调用导致的:

  • 全局变量starterlist在初始化时直接调用refilldb("starter")
  • 而refilldb函数内部又访问了starterlist.clear(),此时starterlist还在初始化过程中,会再次触发refilldb的调用
  • 这个循环不断重复直到栈内存耗尽,最终抛出StackOverflowError
修复方案

把全局变量初始化和数据获取逻辑解耦,让refilldb只负责从Hive读取数据,不要在函数内部操作全局列表:

// 先声明全局列表,初始化为空列表
List<CardFields> starterlist = [];

List<CardFields> refilldb(String db) {
  if (db == "starter") {
    // 指定Box的泛型类型,避免冗余类型转换
    Box<CardFields> starterbox = Hive.box<CardFields>("starter");
    // values.toList()本身就是List<CardFields>,无需强制转换
    return starterbox.values.toList();
  }
  // 补充默认返回,避免编译错误
  return [];
}

// 在合适的时机(比如页面初始化、需要刷新数据时)调用这个方法更新列表
void updateStarterList() {
  starterlist = refilldb("starter");
}
额外注意事项
  1. 不要在全局变量初始化时调用依赖自身的函数,这是引发递归的核心原因
  2. Hive的Box<T>.values返回Iterable<T>,调用toList()后直接就是List<T>,无需额外类型转换
  3. 确保调用refilldb前,Hive已经完成初始化(比如执行过Hive.init()或Hive.initFlutter())

内容的提问来源于stack exchange,提问作者Entrebear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:44:16