我在main中初始化了box数据库,如下所示
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final appDocumentDirectory = await path_provider.getApplicationDocumentsDirectory();
Hive.init(appDocumentDirectory.path);
Hive.registerAdapter(ContactAdapter());
runApp(MyApp());
}
然后我使用futurebuilder插件打开material应用程序中的box,如下所示
FutureBuilder(
future: Hive.openBox<Contact>('contacts'),
builder: (context, snapshot) {
if(snapshot.connectionState == ConnectionState.done){
if(snapshot.hasError){
return Text(snapshot.error.toString() );
}
return ContactPage();
} else {
return Scaffold();
}
}
),
和内部联系人页()
我创造this:-
ValueListenableBuilder(
valueListenable: Hive.box<Contact>('contacts').listenable(),
builder: (context,Box<Contact> box,_){
if(box.values.isEmpty){
return Text('data is empty');
} else {
return ListView.builder(
itemCount: box.values.length,
itemBuilder: (context,index){
var contact = box.getAt(index);
return ListTile(
title: Text(contact.name),
subtitle: Text(contact.age.toString()),
);
},
);
}
},
)
当我运行应用程序时,我得到以下错误
The following HiveError was thrown while handling a gesture:
The box "contacts" is already open and of type Box<Contact>.
当我试图不打开盒子就使用它时,我得到了一个错误,意思是盒子没有打开
我必须在valuelistenablebuilder中使用box而不打开它吗?但是我必须在不同的小部件中再次打开同一个框来添加数据
3条答案
按热度按时间xriantvc1#
可能是因为你想打开里面的盒子
FutureBuilder
. 如果它试图重建自己,它会试图打开已经打开的盒子。在您注册适配器之后,是否可以尝试打开此框,如:而不是
FutureBuilder
回来吧ContactPage
pgx2nnw82#
我跳上这个线程是因为在使用resocoder的hive教程时,我很难弄清楚如何处理弃用的watchboxbuilder,一个google搜索把我带到了这里。
这就是我最终使用的:
main.dart:
然后是contactpage()(注:与op相同):
jutyujz03#
在main.dart文件中:
在contactpage中:
);
以后打电话时可以打开盒子。。