如何在Flutter中使用bloc模式在UI上显示函数回调和错误?

Kus*_*ush 1 dart flutter

bloc.dart

class Bloc{
Bloc(){
additionalController.stream.listen(onAdd);
}

void dispose() async {
additionalController.close();
_itemAdd.close();
}

final additionalController = StreamController<Data>();
Sink<Data> get addItem => additionalController.sink;

Stream<String> get addGet => _itemAdd.stream;
final _itemAdd = BehaviorSubject<String>();

void onAdd(Data data) {
_addWork(data);
}

Future<Null> _addWork(Data data) async {

//work

}).whenComplete(() {

_itemAdd.add("complete work");

}).catchError((e) {
_itemAdd.addError("Error in Adding Data");
  });
 }
}
Run Code Online (Sandbox Code Playgroud)

由于bloc只能使用和共享来处理业务逻辑,但错误处理部分无关,与业务逻辑.

如何在UI上显示回调和bloc错误.我认为不是StreamBuilder唯一的解决方案.

如果我们使用StreamBuilder,那么,每次重建发生时我们都会重复发送回调给bloc,这没有任何意义.

有没有正确的方法来做到这一点?

先感谢您!!

小智 8

到目前为止,对我有用的是使用代表回调的接口.

abstract class AddItemDelegate {
  void onSuccess();
  void onError(String message);
}
Run Code Online (Sandbox Code Playgroud)

然后在bloc如下使用它:

class Bloc {
  AddItemDelegate _delegate;
  // ...
  Function addItem(Data item, AddItemDelegate delegate) => () {
    _delegate = delegate;
    additionalController.sink.add(item);
  }
  // ...
  Future<Null> _addWork(Data data) async {
    try {
      final work = await //work...
      _itemAdd.add("complete work");
      _delegate?.onSuccess();
    }
    catch(e) {
      final error = "Error in Adding Data";
      _itemAdd.addError(error);
      _delegate?.onError(error);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在您StatefulWidget(或StatelessWidget)您可以执行以下操作:

class MyWidget extends StatelessWidget implements AddItemDelegate {
  @override
  void onSuccess() {
    // e.g.: Show a dialog or navigate to other screen
  }

  @override
  void onError(String message) {
    // e.g.: Show an error dialog
  }

  @override
  Widget build(BuildContext context) {
    final bloc = // ...
    final data = // ...
    return MaterialButton(
        child: Text("Add Item"), 
        onPressed: bloc.addItem(data, this));
  }
}
Run Code Online (Sandbox Code Playgroud)

这样可以在使用BLoC模式时使用回调.