From b3f70e15117f4e59160c064d0ad53e85998159f0 Mon Sep 17 00:00:00 2001 From: basemosama Date: Tue, 18 Nov 2025 01:20:32 +0200 Subject: [PATCH 1/6] chore: Bump version to 0.6.0 and update dependencies --- .flutter-plugins-dependencies | 2 +- example/pubspec.lock | 80 +++++++++++-------- .../flutter/generated_plugin_registrant.cc | 3 + .../windows/flutter/generated_plugins.cmake | 1 + pubspec.yaml | 11 +-- 5 files changed, 59 insertions(+), 38 deletions(-) diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies index 35a1d74..c8c4e3f 100644 --- a/.flutter-plugins-dependencies +++ b/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"flutter_secure_storage","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/path_provider_android-2.2.17/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.10/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"flutter_secure_storage_macos","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[],"windows":[],"web":[{"name":"flutter_secure_storage_web","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/","dependencies":[],"dev_dependency":false},{"name":"shared_preferences_web","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":["flutter_secure_storage_macos","flutter_secure_storage_web"]},{"name":"flutter_secure_storage_macos","dependencies":[]},{"name":"flutter_secure_storage_web","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_web"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]}],"date_created":"2025-07-01 17:06:19.227295","version":"3.32.5","swift_package_manager_enabled":{"ios":false,"macos":false}} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.4/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"flutter_secure_storage","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/path_provider_android-2.2.21/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.16/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"flutter_secure_storage_macos","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.4/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"flutter_secure_storage_linux","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_linux","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/","native_build":false,"dependencies":["path_provider_linux"],"dev_dependency":false}],"windows":[{"name":"flutter_secure_storage_windows","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_windows","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/","native_build":false,"dependencies":["path_provider_windows"],"dev_dependency":false}],"web":[{"name":"flutter_secure_storage_web","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/","dependencies":[],"dev_dependency":false},{"name":"shared_preferences_web","path":"/Users/basemosama/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":["flutter_secure_storage_linux","flutter_secure_storage_macos","flutter_secure_storage_web","flutter_secure_storage_windows"]},{"name":"flutter_secure_storage_linux","dependencies":[]},{"name":"flutter_secure_storage_macos","dependencies":[]},{"name":"flutter_secure_storage_web","dependencies":[]},{"name":"flutter_secure_storage_windows","dependencies":["path_provider"]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2025-11-18 01:19:13.073942","version":"3.35.7","swift_package_manager_enabled":{"ios":false,"macos":false}} \ No newline at end of file diff --git a/example/pubspec.lock b/example/pubspec.lock index 02f3b04..8d09c46 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -69,10 +69,18 @@ packages: dependency: transitive description: name: dio - sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9 url: "https://pub.dev" source: hosted - version: "5.8.0+1" + version: "5.9.0" + dio_smart_retry: + dependency: transitive + description: + name: dio_smart_retry + sha256: c8e20da5f49289fa7dce5c9c6b5b120928e3661aefa0fa2d206ea6d93f580928 + url: "https://pub.dev" + source: hosted + version: "7.0.1" dio_web_adapter: dependency: transitive description: @@ -130,10 +138,10 @@ packages: dependency: transitive description: name: flutter_dotenv - sha256: b7c7be5cd9f6ef7a78429cabd2774d3c4af50e79cb2b7593e3d5d763ef95c61b + sha256: d4130c4a43e0b13fefc593bc3961f2cb46e30cb79e253d4a526b1b5d24ae1ce4 url: "https://pub.dev" source: hosted - version: "5.2.1" + version: "6.0.0" flutter_lints: dependency: "direct dev" description: @@ -204,10 +212,10 @@ packages: dependency: transitive description: name: get_it - sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 + sha256: "84792561b731b6463d053e9761a5236da967c369da10b134b8585a5e18429956" url: "https://pub.dev" source: hosted - version: "8.0.3" + version: "9.0.5" http: dependency: transitive description: @@ -236,26 +244,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -288,6 +296,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" path: dependency: transitive description: @@ -356,17 +372,17 @@ packages: dependency: transitive description: name: playx_core - sha256: "2ec52210e11918d2d4d86580ee9f859da434346ffb2fecbb3f903d931414f369" + sha256: b49e07caeda91353f04f68d52c751fdec0513faf46646c74ef785ca258fd1683 url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" playx_network: dependency: "direct main" description: path: ".." relative: true source: path - version: "0.5.1" + version: "0.6.0" plugin_platform_interface: dependency: transitive description: @@ -379,18 +395,18 @@ packages: dependency: transitive description: name: sentry - sha256: "40583b61f5f4dc0ea7095a34c03cd71e17b43bd8866fba34972398f70806b464" + sha256: "10a0bc25f5f21468e3beeae44e561825aaa02cdc6829438e73b9b64658ff88d9" url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "9.8.0" sentry_dio: dependency: transitive description: name: sentry_dio - sha256: "62836fb92b6d3b38748469c63cb60df60917d2d85214d94051c7424e960450c9" + sha256: bee438fd790c534da77f0a6c9cd04c54c818184b8a54bbe7d916489c8aad56a0 url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "9.8.0" shared_preferences: dependency: transitive description: @@ -496,26 +512,26 @@ packages: dependency: transitive description: name: talker - sha256: cf02a0d294701c76022f32bc8eb7e6f943953eb17fa1f8aaee56af210848134b + sha256: "82de443cadfb6c41d457e7774c7890a91c73af3c2f17f3f7c01670bb58d5f5a1" url: "https://pub.dev" source: hosted - version: "4.9.1" + version: "5.0.2" talker_dio_logger: dependency: transitive description: name: talker_dio_logger - sha256: "926688b8ee3d4328d16a978d2d400145afec5448b32014bbb255904bfa648c6e" + sha256: "5bbecc237f3d2c4af9348da5a0086321ed6dd6bf9857d723b1f54f61c810cff2" url: "https://pub.dev" source: hosted - version: "4.9.1" + version: "5.0.2" talker_logger: dependency: transitive description: name: talker_logger - sha256: f1755d517e5ca8b119b65ad2fc1079746a8d03bd565e75d6b9d5aedf5c1d5b15 + sha256: "8218836d871ea5ab1ec616cffe3cdae84e8fb44022d5cc04c95d7b220572b8fb" url: "https://pub.dev" source: hosted - version: "4.9.1" + version: "5.0.2" term_glyph: dependency: transitive description: @@ -528,10 +544,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" typed_data: dependency: transitive description: @@ -552,10 +568,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -584,10 +600,10 @@ packages: dependency: transitive description: name: worker_manager - sha256: af3db5e6c6c8a74ab8f72e25e9d305f8ff60984ca55551397e3c8828ebf30509 + sha256: "1bce9f894a0c187856f5fc0e150e7fe1facce326f048ca6172947754dac3d4f3" url: "https://pub.dev" source: hosted - version: "7.2.6" + version: "7.2.7" xdg_directories: dependency: transitive description: @@ -597,5 +613,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.7.0-0 <4.0.0" + dart: ">=3.8.0-0 <4.0.0" flutter: ">=3.24.0" diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc index 8b6d468..0c50753 100644 --- a/example/windows/flutter/generated_plugin_registrant.cc +++ b/example/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,9 @@ #include "generated_plugin_registrant.h" +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); } diff --git a/example/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake index b93c4c3..4fc759c 100644 --- a/example/windows/flutter/generated_plugins.cmake +++ b/example/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + flutter_secure_storage_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/pubspec.yaml b/pubspec.yaml index a1fd24c..eb37033 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: playx_network description: playx_network is a Wrapper around Dio that can perform api request with better error handling and easily get the result of any api request. -version: 0.5.1 +version: 0.6.0 homepage: https://sourcya.io repository: https://github.com/playx-flutter/playx_network issue_tracker: https://github.com/playx-flutter/playx_network/issues @@ -18,10 +18,11 @@ topics: dependencies: flutter: sdk: flutter - dio: ^5.8.0+1 - sentry_dio: ^9.2.0 - talker_dio_logger: ^4.9.1 - playx_core: ^0.7.3 + dio: ^5.9.0 + sentry_dio: ^9.8.0 + talker_dio_logger: ^5.0.2 + playx_core: ^0.7.4 + dio_smart_retry: ^7.0.1 dio_web_adapter: ^2.1.1 dev_dependencies: From 5f7c70af939edafd4acc11952a31fdc9f0a2f66a Mon Sep 17 00:00:00 2001 From: basemosama Date: Tue, 18 Nov 2025 01:23:06 +0200 Subject: [PATCH 2/6] refactor: Update network exports to include dio_smart_retry and dio_client --- lib/playx_network.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/playx_network.dart b/lib/playx_network.dart index 294a08f..8956fa5 100644 --- a/lib/playx_network.dart +++ b/lib/playx_network.dart @@ -2,7 +2,8 @@ library; export 'package:dio/dio.dart'; export 'package:dio/io.dart'; -export 'package:sentry_dio/sentry_dio.dart'; +export 'package:dio_smart_retry/dio_smart_retry.dart'; +export 'package:playx_network/src/dio/dio_client.dart'; export 'package:playx_network/src/models/error/api_error.dart'; export 'package:playx_network/src/models/exceptions/message/english_exception_message.dart'; export 'package:playx_network/src/models/exceptions/message/exception_message.dart'; @@ -11,4 +12,4 @@ export 'package:playx_network/src/models/logger/logger_settings.dart'; export 'package:playx_network/src/models/network_result.dart'; export 'package:playx_network/src/models/settings/playx_network_client_settings.dart'; export 'package:playx_network/src/playx_network_client.dart'; -export 'package:playx_network/src/dio/dio_client.dart'; +export 'package:sentry_dio/sentry_dio.dart'; From acd8a7b768ed2bdd2ca9fc7e5e75008a90f8d620 Mon Sep 17 00:00:00 2001 From: basemosama Date: Tue, 18 Nov 2025 01:27:41 +0200 Subject: [PATCH 3/6] feat: Add fine-grained logging controls to network settings This adds new options to `PlayxNetworkClientSettings.copyWith` to allow more granular control over logging. Specifically, it introduces toggles for: - `printResponseData` - `printRequestData` - `printRequestHeaders` - `printResponseHeaders` --- .../settings/playx_network_client_settings.dart | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/src/models/settings/playx_network_client_settings.dart b/lib/src/models/settings/playx_network_client_settings.dart index ecc1480..cbaa78b 100644 --- a/lib/src/models/settings/playx_network_client_settings.dart +++ b/lib/src/models/settings/playx_network_client_settings.dart @@ -44,9 +44,18 @@ class PlayxNetworkClientSettings { List? successRequestCodes, bool? useIsolateForMappingJson, bool? useWorkMangerForMappingJsonInIsolate, + bool? printResponseData, + bool? printRequestData, + bool? printRequestHeaders, + bool? printResponseHeaders, }) { return PlayxNetworkClientSettings( - logSettings: logSettings ?? this.logSettings, + logSettings: (logSettings ?? this.logSettings).copyWith( + printRequestData: printRequestData, + printRequestHeaders: printRequestHeaders, + printResponseHeaders: printResponseHeaders, + printResponseData: printResponseData, + ), shouldShowApiErrors: shouldShowApiErrors ?? this.shouldShowApiErrors, exceptionMessages: exceptionMessages ?? this.exceptionMessages, unauthorizedRequestCodes: From 12415fb6c4d0b166ac2bed3aef0709e79ec06fcc Mon Sep 17 00:00:00 2001 From: basemosama Date: Tue, 18 Nov 2025 01:29:54 +0200 Subject: [PATCH 4/6] feat: Add support for PATCH requests Adds a `patch` method to `DioClient` to enable making PATCH requests. Also, introduces `patch` and `patchList` methods in `PlayxNetworkClient` to handle PATCH requests for single objects and lists of objects, respectively, including response and error handling. --- lib/src/dio/dio_client.dart | 37 +++++++++++ lib/src/playx_network_client.dart | 104 ++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) diff --git a/lib/src/dio/dio_client.dart b/lib/src/dio/dio_client.dart index 229033b..f94a8bc 100644 --- a/lib/src/dio/dio_client.dart +++ b/lib/src/dio/dio_client.dart @@ -224,6 +224,43 @@ class DioClient { onReceiveProgress: onReceiveProgress, ); } + + Future patch( + String path, { + Object body = const {}, + Map headers = const {}, + Map query = const {}, + Options? options, + String? contentType, + bool attachCustomHeaders = true, + bool attachCustomQuery = true, + CancelToken? cancelToken, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + PlayxNetworkLoggerSettings? logSettings, + }) async { + return _getDioInstance(logSettings: logSettings).patch( + path, + data: body, + queryParameters: { + if (attachCustomQuery && customQuery != null) + ...?await customQuery?.call(), + ...query, + }, + options: options ?? + Options( + headers: { + if (attachCustomHeaders && customHeaders != null) + ...?await customHeaders?.call(), + ...headers, + }, + contentType: contentType, + ), + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + } } extension DioClientExtensions on Dio { diff --git a/lib/src/playx_network_client.dart b/lib/src/playx_network_client.dart index 6eb4eb4..a62e6b9 100644 --- a/lib/src/playx_network_client.dart +++ b/lib/src/playx_network_client.dart @@ -534,4 +534,108 @@ class PlayxNetworkClient { ); } } + + /// sends a [PATCH] request to the given [url] + /// and returns object of Type [T]. + /// You can pass your own queries, headers weather to attach custom headers or not. + /// Or add custom options which overrides headers and custom headers. + /// Or add cancel token to cancel the request. + Future> patch( + String path, { + Object body = const {}, + Map headers = const {}, + Map query = const {}, + Options? options, + String? contentType, + bool attachCustomHeaders = true, + bool attachCustomQuery = true, + CancelToken? cancelToken, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + required JsonMapper fromJson, + bool shouldHandleUnauthorizedRequest = true, + PlayxNetworkClientSettings? settings, + }) async { + try { + final res = await _dioClient.patch( + path, + body: body, + headers: headers, + query: query, + options: options, + contentType: contentType, + attachCustomHeaders: attachCustomHeaders, + attachCustomQuery: attachCustomQuery, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + logSettings: settings?.logSettings, + ); + return _apiHandler.handleNetworkResult( + response: res, + fromJson: fromJson, + shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, + settings: settings, + ); + // ignore: avoid_catches_without_on_clauses + } catch (error) { + return _apiHandler.handleDioException( + error: error, + shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, + settings: settings, + ); + } + } + + /// sends a [PATCH] request to the given [url] + /// and returns [List] of Type [T]. + /// You can pass your own queries, headers weather to attach custom headers or not. + /// Or add custom options which overrides headers and custom headers. + /// Or add cancel token to cancel the request. + Future>> patchList( + String path, { + Object body = const {}, + Map headers = const {}, + Map query = const {}, + Options? options, + String? contentType, + bool attachCustomHeaders = true, + bool attachCustomQuery = true, + CancelToken? cancelToken, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + required JsonMapper fromJson, + bool shouldHandleUnauthorizedRequest = true, + PlayxNetworkClientSettings? settings, + }) async { + try { + final res = await _dioClient.patch( + path, + body: body, + headers: headers, + query: query, + options: options, + contentType: contentType, + attachCustomHeaders: attachCustomHeaders, + attachCustomQuery: attachCustomQuery, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + logSettings: settings?.logSettings, + ); + return _apiHandler.handleNetworkResultForList( + response: res, + fromJson: fromJson, + shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, + settings: settings, + ); + // ignore: avoid_catches_without_on_clauses + } catch (error) { + return _apiHandler.handleDioException( + error: error, + shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, + settings: settings, + ); + } + } } From 7733cf8a3f550127afc29a603a28070f774daf4f Mon Sep 17 00:00:00 2001 From: basemosama Date: Tue, 18 Nov 2025 01:39:21 +0200 Subject: [PATCH 5/6] feat: Allow passing a custom ErrorMapper per request This introduces the ability to provide a specific `ErrorMapper` for each individual network request. If no `ErrorMapper` is provided for a request, the client will fall back to using the globally configured `ErrorMapper`. This allows for more flexible and granular error handling by enabling custom error parsing on a per-API-call basis. --- lib/src/handler/api_handler.dart | 13 +++++++++++- lib/src/playx_network_client.dart | 33 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/src/handler/api_handler.dart b/lib/src/handler/api_handler.dart index 7301c04..f966ae6 100644 --- a/lib/src/handler/api_handler.dart +++ b/lib/src/handler/api_handler.dart @@ -48,6 +48,7 @@ class ApiHandler { Future> handleNetworkResult({ required Response response, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -59,6 +60,7 @@ class ApiHandler { !successCodes.contains(response.statusCode)) { final NetworkException exception = _handleResponse( response: response, + errorMapper: errorMapper, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest); _printError( header: 'Playx Network Error :', @@ -133,6 +135,7 @@ class ApiHandler { Future>> handleNetworkResultForList({ required Response response, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -145,6 +148,7 @@ class ApiHandler { !successCodes.contains(response.statusCode)) { final NetworkException exception = _handleResponse( response: response, + errorMapper: errorMapper, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest); _printError( header: 'Playx Network Error :', @@ -242,6 +246,7 @@ class ApiHandler { Future> handleNetworkResultForDownload({ required Response response, required bool shouldHandleUnauthorizedRequest, + ErrorMapper? errorMapper, PlayxNetworkClientSettings? settings, }) async { final exceptionMessages = buildExceptionMessages(settings); @@ -252,6 +257,7 @@ class ApiHandler { !successCodes.contains(response.statusCode)) { final NetworkException exception = _handleResponse( response: response, + errorMapper: errorMapper, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest); _printError( header: 'Playx Network Error:', @@ -289,6 +295,7 @@ class ApiHandler { NetworkResult handleDioException({ dynamic error, dynamic stackTrace, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) { @@ -300,12 +307,14 @@ class ApiHandler { ); return NetworkResult.error(_getDioException( error: error, + errorMapper: errorMapper, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest)); } NetworkException _handleResponse( {Response? response, bool shouldHandleUnauthorizedRequest = true, + ErrorMapper? errorMapper, PlayxNetworkClientSettings? settings}) { final exceptionMessages = buildExceptionMessages(settings); final shouldShowApiErrors = buildShouldShowApiErrors(settings); @@ -315,7 +324,7 @@ class ApiHandler { String? errMsg; try { - errMsg = errorMapper(errorJson); + errMsg = (errorMapper ?? this.errorMapper)(errorJson); } catch (e, s) { _printError( header: 'Playx Network Error :', @@ -347,6 +356,7 @@ class ApiHandler { NetworkException _getDioException( {dynamic error, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings}) { final exceptionMessages = buildExceptionMessages(settings); @@ -378,6 +388,7 @@ class ApiHandler { ), DioExceptionType.badResponse => _handleResponse( response: error.response, + errorMapper: errorMapper, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest), DioExceptionType.sendTimeout => SendTimeoutException( diff --git a/lib/src/playx_network_client.dart b/lib/src/playx_network_client.dart index a62e6b9..6b5042e 100644 --- a/lib/src/playx_network_client.dart +++ b/lib/src/playx_network_client.dart @@ -103,6 +103,7 @@ class PlayxNetworkClient { CancelToken? cancelToken, ProgressCallback? onReceiveProgress, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -123,6 +124,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error, stackTrace) { @@ -131,6 +133,7 @@ class PlayxNetworkClient { stackTrace: stackTrace, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -150,6 +153,7 @@ class PlayxNetworkClient { CancelToken? cancelToken, ProgressCallback? onReceiveProgress, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -170,6 +174,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -177,6 +182,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -199,6 +205,7 @@ class PlayxNetworkClient { String lengthHeader = Headers.contentLengthHeader, Object? data, PlayxNetworkClientSettings? settings, + ErrorMapper? errorMapper, }) async { try { final res = await _dioClient.download( @@ -219,6 +226,7 @@ class PlayxNetworkClient { return _apiHandler.handleNetworkResultForDownload( response: res, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, + errorMapper: errorMapper, settings: settings, ); // ignore: avoid_catches_without_on_clauses @@ -226,6 +234,7 @@ class PlayxNetworkClient { return _apiHandler.handleDioException( error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, + errorMapper: errorMapper, settings: settings, ); } @@ -249,6 +258,7 @@ class PlayxNetworkClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -272,6 +282,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -279,6 +290,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -301,6 +313,7 @@ class PlayxNetworkClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -324,6 +337,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -331,6 +345,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -351,6 +366,7 @@ class PlayxNetworkClient { bool attachCustomQuery = true, CancelToken? cancelToken, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -372,6 +388,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -379,6 +396,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -399,6 +417,7 @@ class PlayxNetworkClient { bool attachCustomQuery = true, CancelToken? cancelToken, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -420,6 +439,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -427,6 +447,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -449,6 +470,7 @@ class PlayxNetworkClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -472,6 +494,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -479,6 +502,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -501,6 +525,7 @@ class PlayxNetworkClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -524,6 +549,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -531,6 +557,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -553,6 +580,7 @@ class PlayxNetworkClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -576,6 +604,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -583,6 +612,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } @@ -605,6 +635,7 @@ class PlayxNetworkClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, required JsonMapper fromJson, + ErrorMapper? errorMapper, bool shouldHandleUnauthorizedRequest = true, PlayxNetworkClientSettings? settings, }) async { @@ -628,6 +659,7 @@ class PlayxNetworkClient { fromJson: fromJson, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); // ignore: avoid_catches_without_on_clauses } catch (error) { @@ -635,6 +667,7 @@ class PlayxNetworkClient { error: error, shouldHandleUnauthorizedRequest: shouldHandleUnauthorizedRequest, settings: settings, + errorMapper: errorMapper, ); } } From c1cbc61b54a8e1d34db67dde0f76721dc87fe264 Mon Sep 17 00:00:00 2001 From: basemosama Date: Tue, 18 Nov 2025 01:47:58 +0200 Subject: [PATCH 6/6] refactor: Update changelog --- CHANGELOG.md | 8 ++++++++ README.md | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a11461..85625d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.6.0 +- Updated dependencies to their latest versions. +- PATCH Request Support: Added new methods (patch and patchList) to easily perform PATCH API requests. +- Per-Request Error Mapping: You can now pass a custom ErrorMapper to individual API calls for more specific error handling. +- Granular Logging Control: Added new settings to control exactly what gets printed in the logs (e.g., toggle response data, request headers, etc.). +- Added dio_smart_retry package to support retrying failed requests with exponential backoff. + + ## 0.5.1 - Updated dependencies to their latest versions. - Enhanced logging errors and exceptions to provide more detailed information. diff --git a/README.md b/README.md index be41910..8c9ae36 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Wrapper around [`Dio`](https://pub.dev/packages/dio) that can perform API reques In `pubspec.yaml` add these lines to `dependencies` ```yaml -playx_network: ^0.4.0 +playx_network: ^0.6.0 ``` ## Usage