Flutter Hive Box 首次运行时未找到错误,但在我重新加载应用程序后工作正常

问题描述 投票:0回答:4

我有两个蜂箱,如下所示。当我第一次构建应用程序时,我总是面临这个错误

未找到盒子。你是不是忘记调用 Hive.openBox() 了?

但是,如果我重新加载应用程序,它就可以正常工作。 这是我的 main func 中的代码,我在其中打开 hive 框。 我想知道是什么导致了这个错误。我不希望我的用户在第一次安装应用程序后重新启动该应用程序。

void main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      await Hive.initFlutter();
      await Hive.openBox("User");
      await Hive.openBox("dateData");
    
      runApp(const SplashPage());
    }
flutter persistence flutter-hive
4个回答
1
投票

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(),
            );
          }
        },
      ),
    )

0
投票

使用前需要初始化hive see this image to see how to do that.


0
投票

我已经使用

try{}catch(){}
错误处理修复了它,如下所示。该项目即将到期,我找不到任何更好的解决方案,但这非常完美。这是代码。

void addData() async {
    try{ 
      Box<dynamic> data = Hive.box("boxName");
    }catch(error){
       await Hive.openBox("boxName");
       addData();
    }
}

0
投票

我遇到了与您描述的相同的问题。我使用了两个 Hive 盒子,在应用程序的初始运行中,写入盒子的数据在读取时将返回 null。后续构建按预期运行。

没有报告任何错误,并且代码看起来是正确的。经过大量调试,我找到了解决方案:

使用

多个框时,Hive 框需要不同指定数据类型。仅使用不同的框名称是不够的,可能会导致这种特殊的错误。

为了说明这一点,这是更正后的代码:

void main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      await Hive.initFlutter();
      await Hive.openBox<DataType1>("User");
      await Hive.openBox<DataType2>("dateData");
    
      runApp(const SplashPage());
    }
© www.soinside.com 2019 - 2024. All rights reserved.