我有两个蜂箱,如下所示。当我第一次构建应用程序时,我总是面临这个错误。
未找到盒子。你是不是忘记调用 Hive.openBox() 了?
但是,如果我重新加载应用程序,它就可以正常工作。 这是我的 main func 中的代码,我在其中打开 hive 框。 我想知道是什么导致了这个错误。我不希望我的用户在第一次安装应用程序后重新启动该应用程序。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
await Hive.openBox("User");
await Hive.openBox("dateData");
runApp(const SplashPage());
}
FutureBuilder
会给你创造奇迹,
为什么 Hive 使用 FutureBuilder 更好?
当我们初始化 Hive 时,它会从内存中加载所有数据,并且可能需要一些时间,在此之前我们必须向用户显示某种动画/加载器,否则您的应用程序看起来像是冻结了。
示例:
Scaffold(
body: FutureBuilder(
future: Hive.openBox('box_name'),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Center(
child: Text(snapshot.error.toString()),
);
} else
return Page1();
} else {
return Center(
child: CircularProgressIndicator(),
);
}
},
),
)
我已经使用
try{}catch(){}
错误处理修复了它,如下所示。该项目即将到期,我找不到任何更好的解决方案,但这非常完美。这是代码。
void addData() async {
try{
Box<dynamic> data = Hive.box("boxName");
}catch(error){
await Hive.openBox("boxName");
addData();
}
}
我遇到了与您描述的相同的问题。我使用了两个 Hive 盒子,在应用程序的初始运行中,写入盒子的数据在读取时将返回 null。后续构建按预期运行。
没有报告任何错误,并且代码看起来是正确的。经过大量调试,我找到了解决方案:
使用多个框时,Hive 框需要不同和指定数据类型。仅使用不同的框名称是不够的,可能会导致这种特殊的错误。
为了说明这一点,这是更正后的代码:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
await Hive.openBox<DataType1>("User");
await Hive.openBox<DataType2>("dateData");
runApp(const SplashPage());
}