在Widget Flutter外部调度Bloc事件

时间:2019-11-27 16:06:29

标签: flutter bloc

我是Flutter的新手,我正在尝试创建我的第一个应用程序。 在我的应用中,我为网络通话创建了一个单例课程。

class NetworkUtil {
  Config configuration;
  Dio dio;
  static NetworkUtil _instance = new NetworkUtil._internal();
  NetworkUtil._internal();
  factory NetworkUtil(Config config){
    _instance.configuration = config;
    _instance.dio = new Dio();
    return _instance;
  }

  final JsonDecoder _decoder = new JsonDecoder();

  Future<dynamic> post(String url, {Map headers, body, encoding}) {
    url = _instance.configuration.url+url;

    return dio.post(url, data: body).then((response) {
      final String res = response.data;
      return res;
    }).catchError((e){
      if(e.response.data.containsKey("message")){
        //I Need to dispatch event in blocClass
         final _classBloc = BlocProvider.of<classBloc>(context); //I haven't context here 
         _classBloc .dispatch(ErrorMessage(message: e.response.data["message"]));

      }else{
        throw new Exception("System Error");
      }
    });
  }
}

我的问题是我没有上下文,所以我无法在Bloc中调度事件。

我一直在考虑将上下文作为参数传递,但是我不知道这是否是一个不好的实践,在Android框架上是糟糕的错误实践,将Context作为参数传递,我在Flutter中也不知道。

是否可以使用BlocProvider超越组件?

1 个答案:

答案 0 :(得分:0)

我认为您看错了。您想进行网络呼叫以作为对bloc事件的响应,因此在您的处理函数中-我假设它将在mapEventToState中,因为您使用的是flutter_bloc-您想要具有类似的东西:

// event case
yield LoadingEvent();
try {
  var post = await NetworkUtil.post(...);
  yield CompleteState(post);
} catch (error) {
  // handle errors
  yield ErrorState(error.message);
}