trm11tkr / github-repo-search

株式会社ゆめみ様のFlutterエンジニアコードチェック課題。
0 stars 0 forks source link

GitHub search APIのページングに対応する #8

Closed trm11tkr closed 2 years ago

trm11tkr commented 2 years ago

概要

現状は、各検索キーワードに対して1ページ分しか取得してこれないので、ページングに対応する。 パラメータでページ番号を設定できる。

タスク

trm11tkr commented 2 years ago

リクエストパラメータクラスはfreezedで作成

pageパラメータのインクリメントでページングを行う予定なので int型で扱いたいが、toJsonでエラーを吐いてしまうので以下のようにカスタムコンバーターを適用する

class IntAndStringConverter implements JsonConverter<int, String> {
  const IntAndStringConverter();

  @override
  int fromJson(String value) => int.parse(value);

  @override
  String toJson(int value) {
    return value.toString();
  }
}
class RepoSearchRequestParam with _$RepoSearchRequestParam {
  const factory RepoSearchRequestParam({
    required String q,
    String? sort,
    String? order,
    @IntAndStringConverter() @Default(30) int perPage,
    @IntAndStringConverter() @Default(1) int page,
  }) = _RepoSearchRequestParam;

  factory RepoSearchRequestParam.fromJson(Map<String, dynamic> json) =>
      _$RepoSearchRequestParamFromJson(json);
}
trm11tkr commented 2 years ago

リクエストパラメータをクエリに反映させることでページ指定可能にした

final repoSearchProvider = FutureProvider((ref) {
  final searchQuery = ref.watch(searchQueryProvider);
  final requestParam = RepoSearchRequestParam(
    q: searchQuery,
    perPage: 10,
    page: 2,
  );

  return ref.watch(repoSearchClientProvider).get(
        queryParameters: requestParam.toJson(),
        fromJson: GithubReposState.fromJson,
      );
});
trm11tkr commented 2 years ago

取得したリポジトリリストデータの保管方法