1- import 'dart:convert ' ;
1+ import 'package:dio/dio.dart ' ;
22import 'package:flutter/foundation.dart' ;
3- import 'package:http/http.dart' as http;
43
54import 'version_provider.dart' ;
65
@@ -15,37 +14,48 @@ class ApiVersionProvider implements VersionProvider {
1514 /// Timeout duration
1615 final Duration timeout;
1716
18- /// HTTP client (for testing)
19- final http.Client ? client;
17+ /// Dio client (for testing or custom configuration)
18+ final Dio ? dio;
19+
20+ /// Internal dio instance
21+ Dio ? _internalDio;
2022
2123 ApiVersionProvider ({
2224 required this .endpoint,
2325 this .headers,
2426 this .timeout = const Duration (seconds: 10 ),
25- this .client ,
27+ this .dio ,
2628 });
2729
30+ Dio get _dio {
31+ if (dio != null ) return dio! ;
32+
33+ _internalDio ?? = Dio (BaseOptions (
34+ connectTimeout: timeout,
35+ receiveTimeout: timeout,
36+ headers: {
37+ 'Content-Type' : 'application/json' ,
38+ ...? headers,
39+ },
40+ ));
41+
42+ return _internalDio! ;
43+ }
44+
2845 @override
2946 Future <VersionData > fetchVersionInfo () async {
3047 try {
31- final httpClient = client ?? http.Client ();
32-
33- final response = await httpClient
34- .get (
35- Uri .parse (endpoint),
36- headers: {
37- 'Content-Type' : 'application/json' ,
38- ...? headers,
39- },
40- )
41- .timeout (timeout);
48+ final response = await _dio.get <Map <String , dynamic >>(endpoint);
4249
4350 if (response.statusCode != 200 ) {
4451 throw Exception (
4552 'API request failed with status: ${response .statusCode }' );
4653 }
4754
48- final data = json.decode (response.body) as Map <String , dynamic >;
55+ final data = response.data;
56+ if (data == null ) {
57+ throw Exception ('API response is empty' );
58+ }
4959
5060 // Support various API response formats
5161 // Format 1: Direct response
@@ -69,6 +79,9 @@ class ApiVersionProvider implements VersionProvider {
6979
7080 // Fallback: try to parse the whole response
7181 return VersionData .fromJson (data);
82+ } on DioException catch (e) {
83+ debugPrint ('ApiVersionProvider DioException: ${e .message }' );
84+ rethrow ;
7285 } catch (e) {
7386 debugPrint ('ApiVersionProvider error: $e ' );
7487 rethrow ;
@@ -78,11 +91,12 @@ class ApiVersionProvider implements VersionProvider {
7891 @override
7992 Future <bool > isAvailable () async {
8093 try {
81- final httpClient = client ?? http.Client ();
82-
83- final response = await httpClient
84- .head (Uri .parse (endpoint))
85- .timeout (const Duration (seconds: 5 ));
94+ final response = await _dio.head <void >(
95+ endpoint,
96+ options: Options (
97+ receiveTimeout: const Duration (seconds: 5 ),
98+ ),
99+ );
86100
87101 return response.statusCode == 200 || response.statusCode == 405 ;
88102 } catch (e) {
@@ -92,6 +106,7 @@ class ApiVersionProvider implements VersionProvider {
92106
93107 @override
94108 void dispose () {
95- // Client is typically external, don't dispose
109+ _internalDio? .close ();
110+ _internalDio = null ;
96111 }
97112}
0 commit comments