初始化BLoC时应如何处理异步调用?

时间:2019-08-05 18:29:20

标签: asynchronous flutter bloc flutter-provider

我正在使用Provider包向Flutter应用程序提供一个BLoC对象(手写的,不使用blocflutter_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()

2 个答案:

答案 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());

请确保在继续进行之前完成前两个操作。