From 43db53d99e9cb99a10a016d32cdeb31d2185b875 Mon Sep 17 00:00:00 2001 From: vb Date: Mon, 27 Jul 2020 22:27:52 +0300 Subject: [PATCH] core dio service added with base response model and error mode;l --- lib/core/base/model/base_error.dart | 4 +- lib/core/base/model/base_view_model.dart | 3 ++ .../constants/enums/http_request_enum.dart | 1 + lib/core/extension/network_exntension.dart | 14 ++++++ lib/core/init/network/ICoreDio.dart | 14 ++++++ lib/core/init/network/IResponseModel.dart | 15 ++++++ lib/core/init/network/core_dio.dart | 41 ++++++++++++++++ .../network/network_core/core_operations.dart | 12 +++++ lib/core/init/network/network_manager.dart | 48 +++++++------------ lib/core/init/notifier/theme_notifer.dart | 5 +- .../test/viewmodel/test_view_model.dart | 10 +++- test/feature/login/login_test.dart | 12 +++++ 12 files changed, 142 insertions(+), 37 deletions(-) create mode 100644 lib/core/constants/enums/http_request_enum.dart create mode 100644 lib/core/extension/network_exntension.dart create mode 100644 lib/core/init/network/ICoreDio.dart create mode 100644 lib/core/init/network/IResponseModel.dart create mode 100644 lib/core/init/network/core_dio.dart create mode 100644 lib/core/init/network/network_core/core_operations.dart diff --git a/lib/core/base/model/base_error.dart b/lib/core/base/model/base_error.dart index 54b9bd9..89ab33e 100644 --- a/lib/core/base/model/base_error.dart +++ b/lib/core/base/model/base_error.dart @@ -1,4 +1,6 @@ -class BaseError { +import 'package:fluttermvvmtemplate/core/init/network/IResponseModel.dart'; + +class BaseError extends IErrorModel { final String message; BaseError(this.message); diff --git a/lib/core/base/model/base_view_model.dart b/lib/core/base/model/base_view_model.dart index 627f41c..5dc55a9 100644 --- a/lib/core/base/model/base_view_model.dart +++ b/lib/core/base/model/base_view_model.dart @@ -1,8 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart'; +import 'package:fluttermvvmtemplate/core/init/network/network_manager.dart'; abstract class BaseViewModel { BuildContext context; + ICoreDio coreDio = NetworkManager.instance.coreDio; void setContext(BuildContext context); void init(); } diff --git a/lib/core/constants/enums/http_request_enum.dart b/lib/core/constants/enums/http_request_enum.dart new file mode 100644 index 0000000..d619314 --- /dev/null +++ b/lib/core/constants/enums/http_request_enum.dart @@ -0,0 +1 @@ +enum HttpTypes { GET, POST } diff --git a/lib/core/extension/network_exntension.dart b/lib/core/extension/network_exntension.dart new file mode 100644 index 0000000..003c575 --- /dev/null +++ b/lib/core/extension/network_exntension.dart @@ -0,0 +1,14 @@ +import '../constants/enums/http_request_enum.dart'; + +extension NetworkTypeExtension on HttpTypes { + String get rawValue { + switch (this) { + case HttpTypes.GET: + return "GET"; + case HttpTypes.POST: + return "POST"; + default: + throw "ERROR TYPE"; + } + } +} diff --git a/lib/core/init/network/ICoreDio.dart b/lib/core/init/network/ICoreDio.dart new file mode 100644 index 0000000..685600a --- /dev/null +++ b/lib/core/init/network/ICoreDio.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/init/network/IResponseModel.dart'; + +import '../../base/model/base_model.dart'; +import '../../constants/enums/http_request_enum.dart'; + +abstract class ICoreDio { + Future> fetch(String path, + {@required HttpTypes type, + @required T parseModel, + dynamic data, + Map queryParameters, + void Function(int, int) onReceiveProgress}); +} diff --git a/lib/core/init/network/IResponseModel.dart b/lib/core/init/network/IResponseModel.dart new file mode 100644 index 0000000..3d54918 --- /dev/null +++ b/lib/core/init/network/IResponseModel.dart @@ -0,0 +1,15 @@ +abstract class IResponseModel { + T data; + IErrorModel error; +} + +abstract class IErrorModel { + void statusCode() {} +} + +class ResponseModel extends IResponseModel { + final T data; + final IErrorModel error; + + ResponseModel({this.data, this.error}); +} diff --git a/lib/core/init/network/core_dio.dart b/lib/core/init/network/core_dio.dart new file mode 100644 index 0000000..f08e2ac --- /dev/null +++ b/lib/core/init/network/core_dio.dart @@ -0,0 +1,41 @@ +import 'dart:io'; + +import 'package:dio/adapter.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; + +import '../../base/model/base_error.dart'; +import '../../base/model/base_model.dart'; +import '../../constants/enums/http_request_enum.dart'; +import '../../extension/network_exntension.dart'; +import 'ICoreDio.dart'; +import 'IResponseModel.dart'; + +part "./network_core/core_operations.dart"; + +class CoreDio with DioMixin implements Dio, ICoreDio { + final BaseOptions options; + + CoreDio(this.options) { + this.options = options; + this.interceptors.add(InterceptorsWrapper()); + this.httpClientAdapter = DefaultHttpClientAdapter(); + } + + Future> fetch(String path, + {@required HttpTypes type, + @required T parseModel, + dynamic data, + Map queryParameters, + void Function(int, int) onReceiveProgress}) async { + final response = await request(path, data: data, options: Options(method: type.rawValue)); + switch (response.statusCode) { + case HttpStatus.ok: + case HttpStatus.accepted: + final model = _responseParser(parseModel, _responseParser); + return ResponseModel(data: model); + default: + return ResponseModel(error: BaseError("message")); + } + } +} diff --git a/lib/core/init/network/network_core/core_operations.dart b/lib/core/init/network/network_core/core_operations.dart new file mode 100644 index 0000000..5cb3f8d --- /dev/null +++ b/lib/core/init/network/network_core/core_operations.dart @@ -0,0 +1,12 @@ +part of "../core_dio.dart"; + +extension _CoreDioOperations on CoreDio { + R _responseParser(BaseModel model, dynamic data) { + if (data is List) { + return data.map((e) => model.fromJson(e)).toList() as R; + } else if (data is Map) { + return model.fromJson(data) as R; + } + return data as R; + } +} diff --git a/lib/core/init/network/network_manager.dart b/lib/core/init/network/network_manager.dart index 7744868..6f8dfb8 100644 --- a/lib/core/init/network/network_manager.dart +++ b/lib/core/init/network/network_manager.dart @@ -1,11 +1,13 @@ import 'dart:io'; import 'package:dio/dio.dart'; +import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart'; import '../../base/model/base_error.dart'; import '../../base/model/base_model.dart'; import '../../constants/enums/locale_keys_enum.dart'; import '../cache/locale_manager.dart'; +import 'core_dio.dart'; class NetworkManager { static NetworkManager _instance; @@ -14,42 +16,24 @@ class NetworkManager { return _instance; } + ICoreDio coreDio; + NetworkManager._init() { final baseOptions = BaseOptions( baseUrl: "https://jsonplaceholder.typicode.com/", headers: {"val": LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN)}, ); - _dio = Dio(baseOptions); - - _dio.interceptors.add(InterceptorsWrapper( - onRequest: (options) { - options.path += "veli"; - }, - // onResponse: (e) { - // return e.data; - // }, - onError: (e) { - return BaseError(e.message); - }, - )); - } - - Dio _dio; - - Future dioGet(String path, T model) async { - final response = await _dio.get(path); - - switch (response.statusCode) { - case HttpStatus.ok: - final responeBody = response.data; - if (responeBody is List) { - return responeBody.map((e) => model.fromJson(e)).toList(); - } else if (responeBody is Map) { - return model.fromJson(responeBody); - } - return responeBody; - break; - default: - } + // _dio = Dio(baseOptions); + + coreDio = CoreDio(baseOptions); + + // _dio.interceptors.add(InterceptorsWrapper( + // onRequest: (options) { + // options.path += "veli"; + // }, + // onError: (e) { + // return BaseError(e.message); + // }, + // )); } } diff --git a/lib/core/init/notifier/theme_notifer.dart b/lib/core/init/notifier/theme_notifer.dart index f3e80df..f997335 100644 --- a/lib/core/init/notifier/theme_notifer.dart +++ b/lib/core/init/notifier/theme_notifer.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:izmirtarih/core/constants/enums/app_theme_enum.dart'; -import 'package:izmirtarih/core/init/theme/app_theme_light.dart'; + +import '../../constants/enums/app_theme_enum.dart'; +import '../theme/app_theme_light.dart'; class ThemeNotifier extends ChangeNotifier { ThemeData _currentTheme = AppThemeLight.instance.theme; diff --git a/lib/view/authenticate/test/viewmodel/test_view_model.dart b/lib/view/authenticate/test/viewmodel/test_view_model.dart index 00c61d8..7cec398 100644 --- a/lib/view/authenticate/test/viewmodel/test_view_model.dart +++ b/lib/view/authenticate/test/viewmodel/test_view_model.dart @@ -1,4 +1,6 @@ import 'package:flutter/cupertino.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart'; +import 'package:fluttermvvmtemplate/core/init/network/IResponseModel.dart'; import 'package:mobx/mobx.dart'; import 'package:provider/provider.dart'; @@ -38,9 +40,13 @@ abstract class _TestViewModelBase with Store, BaseViewModel { @action Future getSampleRequest() async { isLoading = true; - final list = await NetworkManager.instance.dioGet("x", TestModel()); - if (list is List) { + // final list = await NetworkManager.instance.dioGet("x", TestModel()); + + final response = await coreDio.fetch, TestModel>("x", type: HttpTypes.GET, parseModel: TestModel()); + if (response.data is List) { //print true + } else { + // response.error; } isLoading = false; } diff --git a/test/feature/login/login_test.dart b/test/feature/login/login_test.dart index 214327e..36963c6 100644 --- a/test/feature/login/login_test.dart +++ b/test/feature/login/login_test.dart @@ -1,4 +1,7 @@ import 'package:flutter_test/flutter_test.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_error.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_model.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/test/model/test_model.dart'; main() { setUp(() { @@ -31,5 +34,14 @@ main() { final isUserLogin = true; expect(isUserLogin, isTrue); }); + + test('dynamic parse', () async { + final error = BaseError("aaa"); + final errorDynamic = error as dynamic; + + // final errorDynamic2 = errorDynamic as TestModel; + + expect(errorDynamic, isNotNull); + }); }); }