我正在使用Provider
包向Flutter应用程序提供一个BLoC对象(手写的,不使用bloc
或flutter_bloc
包)。我需要进行一些异步调用才能正确初始化BLoC(例如,SharedPreferences
中的设置和其他保存的信息)。到目前为止,我已经将这些async
调用写入了几个单独的函数,这些函数在BLoC的构造函数中被调用:
class MyBloc {
MySettings _settings;
List<MyOtherStuff> _otherStuff;
MyBloc() {
_loadSettings();
_loadOtherStuff();
}
Future<void> _loadSettings() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
// loads settings into _settings...
}
Future<void> _loadOtherStuff() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
// loads other stuff into _otherStuff...
}
}
我想保证_loadSettings()
和_loadOtherStuff()
在我们深入应用程序之前完成,以便依赖设置/其他内容的代码加载正确的信息(例如,我想要外出打一些网络电话,初始化通知等之前要加载的设置。)
据我了解,构造函数不能异步,因此我不能await
构造函数。我曾尝试为我的BLoC提供一个init()
和/或_loadSettings()
的{{1}}函数(或类似功能),但是我很难找到放置它的好地方
这些电话应该放在哪里?还是我只是误解了_loadOtherStuff()
?
答案 0 :(得分:0)
您可以使用流来收听完成情况。
let mv = new Movie("SpiderMan");
mv.setCrew({crew_varA: "Peter Parker", crew_varB:false, crew_varC:null, crew_varD:null}; //is there a way to set only one property of Crew and add other properties one by one based on some logic??
然后使用streamBuilder
class MyBloc {
MySettings _settings;
List<MyOtherStuff> _otherStuff;
final _completer = StreamController<Void>.broadcast();
Stream<void> get completer => _completer.stream;
MyBloc() {
allInit();
}
allInit()async{
await _loadSettings();
await _loadOtherStuff();
_completer.sink.add(null);
}
Future<void> _loadSettings() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
// loads settings into _settings...
return;
}
Future<void> _loadOtherStuff() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
// loads other stuff into _otherStuff...
return;
}
}
答案 1 :(得分:0)
我最终也得到了Future.wait()的帮助:
Future.wait([_loadSettings(), _loadOtherStuff()]).then((_) => _doMoreStuff());
请确保在继续进行之前完成前两个操作。