【问题标题】:Flutter hive box not found even though it was openedFlutter hive box 即使打开也找不到
【发布时间】:2022-11-28 00:50:36
【问题描述】:

我正在使用 Hive 构建一个 flutter 应用程序,但无法解决错误“Box not found. Did you forget to call Hive.openBox()?”。 我的主要方法是这样的:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
   Hive
    ..initFlutter()
    ..registerAdapter(CountedAdapter())
    ..openBox<Counted>('counters');
  runApp(const MyApp());
}

我还为我的 Counted 类设置了类型适配器,它绝对正确,因为我以前使用过它。我创建了一个名为 DataManager 的类以便于访问:

class DataManager{
  static Box<Counted> getCounters()=>Hive.box<Counted>('counters');
}

我正在尝试在 ValueListenableBuilder 中使用,但我一次又一次地收到此错误。我该如何解决? 这是我的主页小部件,我想在其中使用它。

import 'package:counter/manager/datamanager.dart';
import 'package:counter/model/counted.dart';
import 'package:fab_circular_menu/fab_circular_menu.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:hive_flutter/hive_flutter.dart';

class Home extends StatefulWidget {
  static const route = '/';

  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      minimum: const EdgeInsets.all(8),
      child: Scaffold(
          floatingActionButton: FabCircularMenu(
            children: [
              IconButton(
                onPressed: () {},
                icon: const Icon(FontAwesomeIcons.plus),
              ),
              IconButton(
                  onPressed: () {}, icon: const Icon(FontAwesomeIcons.trash)),
            ],
            animationDuration: const Duration(milliseconds: 500),
            ringDiameter: 300,
            ringColor: Colors.teal,
          ),
          body: ValueListenableBuilder<Box<Counted>>(
            valueListenable: DataManager.getCounters().listenable(),
            builder: (BuildContext context, box, _) {
              if (!box.isOpen || box.isEmpty) {
                return const Center(
                    child: Text('No counter found. Create and save one.'));
              }
              final list = box.values.toList().cast<Counted>();
              return ListView(
                children: List.generate(box.values.length, (i) {
                  return SizedBox(
                    height: 30,
                    child: Text(list[i].name.toString()),
                  );
                }),
              );
            },
          )),
    );
  }
}

顺便说一句,我也尝试等待 openBox() 方法,但它也不起作用。

【问题讨论】:

    标签: android flutter dart flutter-hive


    【解决方案1】:

    HiveopenBox()方法是异步的,打开一个盒子需要一些时间,所以你不能在那个盒子还没有打开的时候调用它,所以你需要把你的main()改成这样:

     Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
       Hive
        ..initFlutter()
        ..registerAdapter(CountedAdapter());
        await Hive.openBox<Counted>('counters'); // wait until the box is opened.
      runApp(const MyApp());
    }
    

    【讨论】:

    • 您真的不应该在您的 UI 中使用 FutureBuilder 吗?
    • 不,你不需要,因为没有从那个 Future 获得快照,它只按时打开那个框,然后你可以从你的其他小部件,屏幕同步使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2019-11-10
    • 2018-09-25
    • 2018-06-17
    相关资源
    最近更新 更多