diff --git a/example/bin/main.dart b/example/bin/main.dart index 8a4ccf0..3fe22eb 100644 --- a/example/bin/main.dart +++ b/example/bin/main.dart @@ -1,3 +1,65 @@ -main() { - print("Hello world"); +import 'dart:async'; +import 'package:meta/meta.dart'; +import 'package:dart_di/dart_di.dart'; + +void main() async { + final dataModule = new DiContainer() + ..bind().toValue(new ApiClientMock()) + ..bind() + .toFactory1((c) => new NetworkDataRepository(c)) + ..bind().toFactory1((s) => new DataBloc(s)); + + final dataBloc = dataModule.resolve(); + dataBloc.data.listen((d) => print('Received data: $d'), + onError: (e) => print('Error: $e'), onDone: () => print('DONE')); + + await dataBloc.fetchData(); +} + +class DataBloc { + final DataRepository _dataRepository; + + Stream get data => _dataController.stream; + StreamController _dataController = new StreamController.broadcast(); + + DataBloc(this._dataRepository); + + Future fetchData() async { + try { + _dataController.sink.add(await _dataRepository.getData()); + } catch (e) { + _dataController.sink.addError(e); + } + } + + void dispose() { + _dataController.close(); + } +} + +abstract class DataRepository { + Future getData(); +} + +class NetworkDataRepository implements DataRepository { + final ApiClient _apiClient; + final _token = 'token'; + + NetworkDataRepository(this._apiClient); + + @override + Future getData() async => await _apiClient.sendRequest( + url: 'www.google.com', token: _token, requestBody: {'type': 'data'}); +} + +abstract class ApiClient { + Future sendRequest({@required String url, String token, Map requestBody}); +} + +class ApiClientMock implements ApiClient { + @override + Future sendRequest( + {@required String url, String token, Map requestBody}) async { + return 'hello world'; + } }