2

我正在使用该包向我的 Flutter 应用程序Provider提供 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()和/或的函数(或类似的东西) _loadOtherStuff(),但我很难找到一个放置它的好地方。

我应该把这些电话放在哪里?还是我只是误会了async/await

4

2 回答 2

0

您可以使用流来侦听完成情况。

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;
  }


}

然后你使用一个 streamBuilder

  return StreamBuilder(
    stream: myBloc.completer,
    builder: (context, AsyncSnapshot snapshot) {
      if (!snapshot.hasData) return Text('loading...');
    //stuff to run after init
  }, 
于 2019-08-06T04:16:51.260 回答
0

我最终还使用了 Future.wait() 的一些帮助:

Future.wait([_loadSettings(), _loadOtherStuff()]).then((_) => _doMoreStuff());

这确保在我们继续之前完成前两个。

于 2019-08-06T17:58:41.277 回答