【DI】依存の書き換えハンズオン_ヒント・スモールステップ
https://gyazo.com/ccb3a06f3e8de20b071d971115bcef30
1)パッケージの追加
code:pubspec.yaml
dependencies:
# app_review: ^2.1.2+1
connectivity_plus: ^4.0.1
cupertino_icons: ^1.0.2
dio: ^5.1.2
firebase_core: ^2.13.1
firebase_remote_config: ^4.2.2
flutter:
sdk: flutter
flutter_hooks: ^0.18.5+1
freezed_annotation: ^2.1.0
google_mobile_ads: ^3.0.0
hooks_riverpod: ^2.3.6
http: ^1.1.0
logger: ^1.1.0
package_info_plus: ^4.0.1
version: ^3.0.2
httpの部分を追加
おそらく保存を実行すればimportされるが、できてない場合はコマンドでfvm flutter pub getを実行を試すとよい。
2)ファイル作成場所
beeeyan.iconは「api_client」フォルダの中とし、「api_client_http.dart」という名前にした
https://gyazo.com/0658ed519ca2d9628cb63042bd412e17
3)新しいクライアントの作成方法(方針のみ)
「AbstractApiClient」をimplementsし、getをoverrideする。
code:api_client_http.dart
class ApiClientHttp implements AbstractApiClient {
@override
Future<ResponseResult> get(
String path, {
Map<String, dynamic>? queryParameters,
Map<String, dynamic>? header,
}) async {
~~~
4)httpパッケージの使い方
https://pub.dev/packages/http/example
exampleにある通り「as」を利用してprefixを利用するのが無難かと思ってます。
code:api_client_http.dart
import 'package:http/http.dart' as http;
httpのパッケージを呼び出す時は以下の用に書きます
code:api_client_http.dart
http.get(~~);
5)型変換した場所
パッケージの違いで型が違ったので帳尻合わせました。
code:api_client_http.dart
final response = await http.get(
Uri.parse(path),
headers: header as Map<String, String>?,
);
6)BaseResponseDataに変換するメソッド
Responseはhttpパッケージのものです。
code:api_client_http.dart
BaseResponseData _parseResponse(Response response) {
final statusCode = response.statusCode;
final baseResponseData = BaseResponseData.fromDynamic(response.body);
validateResponse(statusCode: statusCode, data: baseResponseData);
return baseResponseData;
}
7)ApiClientHttpクラスの全容
code:api_client_http.dart
class ApiClientHttp implements AbstractApiClient {
@override
Future<ResponseResult> get(
String path, {
Map<String, dynamic>? queryParameters,
Map<String, dynamic>? header,
}) async {
try {
final response = await http.get(
Uri.parse(path),
headers: header as Map<String, String>?,
);
final baseResponseData = _parseResponse(response);
return ResponseResult.success(data: baseResponseData);
} on ApiException catch (e) {
return ResponseResult.failure(
message: e.message ?? e.toString(),
);
} on SocketException {
return const ResponseResult.failure(
message: networkNotConnected,
);
} on FormatException {
return const ResponseResult.failure(
message: responseFormatNotValid,
);
} on Exception catch (e) {
return ResponseResult.failure(message: e.toString());
}
}
}
BaseResponseData _parseResponse(Response response) {
final statusCode = response.statusCode;
final baseResponseData = BaseResponseData.fromDynamic(response.body);
validateResponse(statusCode: statusCode, data: baseResponseData);
return baseResponseData;
}
8)依存注入している部分
code:api_client_http.dart
final apiClientHttpProvider = Provider<AbstractApiClient>(
(ref) => ApiClientHttp(),
);
code:pokemon_repository.dart
final pokemonRepositoryProvider = Provider(
(ref) => PokemonRepository(
ref.watch(apiClientHttpProvider),
),
);