而不是调用一些异步函数来获取文档目录并在其中初始化配置单元数据库 main
函数,我想让事情尽可能抽象。我想实施 Hive.init(..)
在提供程序服务中调用该服务 initState()
方法。以这种方式我的 main
方法不关心甚至不知道我在使用什么数据库,而不是调用提供程序服务。实现应该是这样的。
服务.dart
class Service extends ChangeNotifier {
....
Future<void> init() async {
Directory dir = await getExternalStorageDirectory();
Hive.init(dir.path);
....
视图.dart
class MyPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (BuildContext context) => Service(),
child: _MyPageContent(),
);
}
}
.....
class _MyPageContent extends StatefulWidget {
@override
__MyPageContentState createState() => __MyPageContentState();
}
class __MyPageContentState extends State<_MyPageContent> {
@override
void initState() {
super.initState();
Provider.of<Service>(context, listen: false).init();
}
....
....
然而,这是行不通的。我得到的错误
HiveError (HiveError: You need to initialize Hive or provide a path to store the box.)
原因可能是 Service.init()
方法是异步的,正在内部调用 initState()
到…的时候 build
方法执行它的任务。有什么办法解决这个问题吗?
2条答案
按热度按时间p1iqtdky1#
在服务加载配置单元时,为其指定要执行的函数
根据您给的函数设置的状态更改内容
Service.init
```class MyPage extends StatefulWidget {
@override
_MyPageState createState() => _MyPageState();
}
class _MyPageState extends State {
bool doneInitializing = false;
Service _service;
@override
void initState() {
_service = Service();
_service.init(() {
setState(() {
doneInitializing = true;
});
});
}
@override
Widget build(BuildContext context) {
return doneInitializing
? ChangeNotifierProvider(
create: (BuildContext context) => _service,
child: _MyPageContent(),
)
: CircularProgressIndicator();
}
}
qybjjes12#
我改变了主意
state
它似乎在工作。