initstate方法中的dart初始化配置单元

iqxoj9l9  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(304)

而不是调用一些异步函数来获取文档目录并在其中初始化配置单元数据库 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 方法执行它的任务。有什么办法解决这个问题吗?

p1iqtdky

p1iqtdky1#

在服务加载配置单元时,为其指定要执行的函数

class Service extends ChangeNotifier {
  Future<void> init(Function onDoneInitializing) async {
    Directory dir = await getExternalStorageDirectory();
    Hive.init(dir.path);
    onDoneInitializing();
  }
}

根据您给的函数设置的状态更改内容 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();
}
}

qybjjes1

qybjjes12#

我改变了主意 state 它似乎在工作。

class __MyPageContentState extends State<_MyPageContent> {

  bool _init = false;

  @override
  void initState() {
    super.initState();
    Provider.of<Service>(context, listen: false).init()
    .then((_) => setState(() => _init = true));
  }

  @override
  Widget build(BuildContext context) {
    if(_init)
      return MyPreciousWidget(...);
    return CircularProgressIndicator();
  }
....

相关问题