【发布时间】: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