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"); }
额外注意事项
- 不要在全局变量初始化时调用依赖自身的函数,这是引发递归的核心原因
- Hive的
Box<T>.values返回Iterable<T>,调用toList()后直接就是List<T>,无需额外类型转换 - 确保调用
refilldb前,Hive已经完成初始化(比如执行过Hive.init()或Hive.initFlutter())
内容的提问来源于stack exchange,提问作者Entrebear
相关产品推荐
相关产品推荐

