implemented expiremental di with new api

This commit is contained in:
Sergey Penkovsky
2021-04-21 08:05:38 +03:00
parent 2d6fdbe04c
commit 6a2d86c83c
6 changed files with 247 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
import 'dart:async';
import 'package:meta/meta.dart';
import 'package:dart_di/experimental/scope.dart';
import 'package:dart_di/experimental/module.dart';
class AppModule extends Module {
@override
void builder(Scope currentScope) {
bind<ApiClient>().withName("apiClient").toInstance(ApiClientMock());
bind<DataRepository>().withName("networkRepo").toProvide(
() => NetworkDataRepository(
currentScope.resolve<ApiClient>(named: "apiClient"),
),
);
// .singeltone();
bind<DataBloc>().toProvide(
() => DataBloc(
currentScope.resolve<DataRepository>(named: "networkRepo"),
),
);
}
}
void main() async {
final scope = openRootScope().installModules([
AppModule(),
]);
final dataBloc = scope.resolve<DataBloc>();
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<String> get data => _dataController.stream;
StreamController<String> _dataController = new StreamController.broadcast();
DataBloc(this._dataRepository);
Future<void> fetchData() async {
try {
_dataController.sink.add(await _dataRepository.getData());
} catch (e) {
_dataController.sink.addError(e);
}
}
void dispose() {
_dataController.close();
}
}
abstract class DataRepository {
Future<String> getData();
}
class NetworkDataRepository implements DataRepository {
final ApiClient _apiClient;
final _token = 'token';
NetworkDataRepository(this._apiClient);
@override
Future<String> 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';
}
}