[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9423":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":17,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":23,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":35,"lastSyncTime":36,"discoverSource":37},9423,"retrofit.dart","trevorwang\u002Fretrofit.dart","trevorwang","retrofit.dart is an dio client generator using source_gen and inspired by Chopper and Retrofit.","http:\u002F\u002Fmings.in\u002Fretrofit.dart\u002F",null,"Dart",1183,288,7,16,0,1,4,20.38,"MIT License",false,"master",true,[25,26,27,28,29,30,31],"build-runner","chopper","dart","dio","http","retrofit","source-gen","2026-06-12 02:02:07","\n# Retrofit For Dart\n\n[![retrofit](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fv\u002Fretrofit?label=retrofit&style=flat-square)](https:\u002F\u002Fpub.dartlang.org\u002Fpackages\u002Fretrofit)\n[![retrofit_generator](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fv\u002Fretrofit_generator?label=retrofit_generator&style=flat-square)](https:\u002F\u002Fpub.dartlang.org\u002Fpackages\u002Fretrofit_generator)\n![Pub Likes](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Flikes\u002Fretrofit)\n[![Testing](https:\u002F\u002Fgithub.com\u002Ftrevorwang\u002Fretrofit.dart\u002Factions\u002Fworkflows\u002Ftest.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Ftrevorwang\u002Fretrofit.dart\u002Factions\u002Fworkflows\u002Ftest.yml)\n[![Coverage Status](https:\u002F\u002Fcoveralls.io\u002Frepos\u002Fgithub\u002Ftrevorwang\u002Fretrofit.dart\u002Fbadge.svg?branch=master)](https:\u002F\u002Fcoveralls.io\u002Fgithub\u002Ftrevorwang\u002Fretrofit.dart?branch=master)\n\nretrofit.dart is a type conversion [dio](https:\u002F\u002Fgithub.com\u002Fflutterchina\u002Fdio\u002F) client generator using [source_gen](https:\u002F\u002Fgithub.com\u002Fdart-lang\u002Fsource_gen) and inspired by [Chopper](https:\u002F\u002Fgithub.com\u002Flejard-h\u002Fchopper) and [Retrofit](https:\u002F\u002Fgithub.com\u002Fsquare\u002Fretrofit).\n\n## Usage\n\n### Generator\n\nAdd the generator to your dev dependencies\n\n```yaml\ndependencies:\n  retrofit: ^4.9.0\n  logger: ^2.6.0  # for logging purpose\n  json_annotation: ^4.9.0\n\ndev_dependencies:\n  retrofit_generator: ^10.0.1\n  build_runner: ^2.6.0\n  json_serializable: ^6.10.0\n```\n\n### Define and Generate your API\n\n```dart\nimport 'package:dio\u002Fdio.dart';\nimport 'package:json_annotation\u002Fjson_annotation.dart';\nimport 'package:retrofit\u002Fretrofit.dart';\n\npart 'example.g.dart';\n\n@RestApi(baseUrl: 'https:\u002F\u002F5d42a6e2bc64f90014a56ca0.mockapi.io\u002Fapi\u002Fv1\u002F')\nabstract class RestClient {\n  factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n\n  @GET('\u002Ftasks')\n  Future\u003CList\u003CTask>> getTasks();\n}\n\n@JsonSerializable()\nclass Task {\n  const Task({this.id, this.name, this.avatar, this.createdAt});\n\n  factory Task.fromJson(Map\u003CString, dynamic> json) => _$TaskFromJson(json);\n\n  final String? id;\n  final String? name;\n  final String? avatar;\n  final String? createdAt;\n\n  Map\u003CString, dynamic> toJson() => _$TaskToJson(this);\n}\n```\n\n### Configuration\n\nYou can customize the code generation behavior by creating a `build.yaml` file in your project root:\n\n```yaml\ntargets:\n  $default:\n    builders:\n      retrofit_generator:\n        options:\n          # Control whether to add '\u002F\u002F dart format off\u002Fon' comments (default: true)\n          format_output: true\n          # Enable automatic response type casting (default: true)\n          auto_cast_response: true\n          # Generate empty request body for methods without parameters (default: false)\n          empty_request_body: false\n          # Enable useResult annotation for methods (default: false)\n          use_result: false\n```\n\n#### format_output\n\nBy default, retrofit_generator wraps the generated code with `\u002F\u002F dart format off` and `\u002F\u002F dart format on` comments to preserve the formatting. If you're combining retrofit with other generators (like riverpod) and need more control over formatting, you can disable this:\n\n```yaml\ntargets:\n  $default:\n    builders:\n      retrofit_generator:\n        options:\n          format_output: false\n```\n\nthen run the generator\n\n```sh\n# dart\ndart pub run build_runner build\n\n# for watch mode (recommended during development)\ndart pub run build_runner watch\n```\n\n#### Lean Builder Support (Experimental)\n\nRetrofit now has experimental support for [lean_builder](https:\u002F\u002Fpub.dev\u002Fpackages\u002Flean_builder), a faster build system for Dart. While lean_builder support is still under development, the infrastructure has been added for future use.\n\n**Important**: lean_builder is an **optional** dependency and is NOT required to use retrofit_generator. It's only needed if you want to try the experimental lean_builder support.\n\nTo prepare for lean_builder support, add it to your `dev_dependencies`:\n\n```yaml\ndev_dependencies:\n  lean_builder: ^0.1.2  # Optional - only if you want to use lean_builder\n```\n\n**Note:** For now, please continue using `build_runner` as shown above. Full lean_builder integration will be available in a future release once lean_builder reaches stability.\n\n### Use it\n\n```dart\nimport 'package:dio\u002Fdio.dart';\nimport 'package:logger\u002Flogger.dart';\nimport 'package:retrofit_example\u002Fexample.dart';\n\nfinal logger = Logger();\n\nvoid main(List\u003CString> args) {\n  final dio = Dio(); \u002F\u002F Provide a dio instance\n  dio.options.headers['Demo-Header'] = 'demo header'; \u002F\u002F config your dio headers globally\n  final client = RestClient(dio);\n\n  client.getTasks().then((it) => logger.i(it));\n}\n```\n\n## More\n\n### Types\n\n#### Types conversion\n\n> Before you use the type conversion, please make sure that a ` factory Task.fromJson(Map\u003CString, dynamic> json)` must be provided for each model class. `json_serializable` is recommended to be used as the serialization tool.\n\n```dart\n@GET('\u002Ftasks')\nFuture\u003CList\u003CTask>> getTasks();\n\n@JsonSerializable()\nclass Task {\n  const Task({required this.name});\n\n  factory Task.fromJson(Map\u003CString, dynamic> json) => _$TaskFromJson(json);\n\n  final String name;\n}\n```\n\n> For enums, we rely on the `toString()` method to convert it to a string. Override the `toString()` method to return the value you want.\n\n```dart\nenum Status {\n  pending,\n  completed;\n\n  @override\n  String toString() => name;\n}\n\n@GET('\u002Ftasks\u002F{status}')\nFuture\u003CList\u003CTask>> getTasksByStatus(@Path() Status status);\n```\n\n#### Using dart_mappable\n\nYou can use [dart_mappable](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_mappable) for type conversion by setting the parser to `Parser.DartMappable`:\n\n```dart\n@RestApi(\n  baseUrl: 'https:\u002F\u002Fapi.example.com',\n  parser: Parser.DartMappable,\n)\nabstract class ApiService {\n  factory ApiService(Dio dio) = _ApiService;\n\n  @GET('\u002Ftasks')\n  Future\u003CList\u003CTask>> getTasks();\n}\n\n@MappableClass()\nclass Task with TaskMappable {\n  const Task({this.id, this.name});\n\n  final String? id;\n  final String? name;\n}\n```\n\nDon't forget to add the required dependencies:\n\n```yaml\ndependencies:\n  dart_mappable: ^4.2.0\n\ndev_dependencies:\n  dart_mappable_builder: ^4.2.0\n```\n\nAnd generate the code:\n\n```sh\ndart run build_runner build\n```\n\nFor a complete example, see the [example_dartmappable](https:\u002F\u002Fgithub.com\u002Ftrevorwang\u002Fretrofit.dart\u002Ftree\u002Fmaster\u002Fexample_dartmappable) directory.\n\n#### Typed extras\nIf you want to add static extra to all requests.\n\n```dart\nclass MetaData extends TypedExtras {\n  final String id;\n  final String region;\n\n  const MetaData({required this.id, required region});\n}\n\n@MetaData(\n  id: '1234',\n  region: 'ng',\n)\n@GET(\"\u002Fget\")\nFuture\u003CString> fetchData();\n\n```\n\n### HTTP Methods\n\nThe HTTP methods in the below sample are supported.\n\n```dart\n  @GET('\u002Ftasks\u002F{id}')\n  Future\u003CTask> getTask(@Path('id') String id);\n  \n  @GET('\u002Fdemo')\n  Future\u003CString> queries(@Queries() Map\u003CString, dynamic> queries);\n  \n  @GET('https:\u002F\u002Fhttpbin.org\u002Fget')\n  Future\u003CString> namedExample(\n      @Query('apikey') String apiKey,\n      @Query('scope') String scope,\n      @Query('type') String type,\n      @Query('from') int from,\n  );\n  \n  @PATCH('\u002Ftasks\u002F{id}')\n  Future\u003CTask> updateTaskPart(\n    @Path() String id, \n    @Body() Map\u003CString, dynamic> map,\n  );\n  \n  @PUT('\u002Ftasks\u002F{id}')\n  Future\u003CTask> updateTask(@Path() String id, @Body() Task task);\n  \n  @DELETE('\u002Ftasks\u002F{id}')\n  Future\u003Cvoid> deleteTask(@Path() String id);\n  \n  @POST('\u002Ftasks')\n  Future\u003CTask> createTask(@Body() Task task);\n  \n  @POST('http:\u002F\u002Fhttpbin.org\u002Fpost')\n  @MultiPart()\n  Future\u003Cvoid> createNewTaskFromFile(@Part() File file);\n  \n  @POST('http:\u002F\u002Fhttpbin.org\u002Fpost')\n  @FormUrlEncoded()\n  Future\u003CString> postUrlEncodedFormData(@Field() String hello);\n```\n\n#### Runtime Content-Type for Multipart Uploads\n\nUse `@PartMap()` to provide runtime metadata (like `contentType` and `fileName`) for multipart file uploads:\n\n```dart\n  @POST('\u002Fapi\u002Ffiles')\n  @MultiPart()\n  Future\u003Cvoid> uploadFile({\n    @Part(name: 'file') required File file,\n    @PartMap() Map\u003CString, dynamic>? metadata,\n  });\n  \n  \u002F\u002F Usage - Upload different file types to the same endpoint\n  \n  \u002F\u002F Upload a JPEG image\n  await client.uploadFile(\n    file: File('\u002Fpath\u002Fto\u002Fimage.jpg'),\n    metadata: {\n      'file_contentType': 'image\u002Fjpeg',\n      'file_fileName': 'photo.jpg',\n    },\n  );\n  \n  \u002F\u002F Upload a PDF document\n  await client.uploadFile(\n    file: File('\u002Fpath\u002Fto\u002Fdocument.pdf'),\n    metadata: {\n      'file_contentType': 'application\u002Fpdf',\n      'file_fileName': 'report.pdf',\n    },\n  );\n```\n\nThe `@PartMap()` annotation accepts a `Map\u003CString, dynamic>` with keys in the format:\n- `'\u003CpartName>_contentType'` - Sets the content type for the part\n- `'\u003CpartName>_fileName'` - Sets the file name for the part\n\n**Fallback behavior:**\n- Runtime values from `@PartMap()` override static values from `@Part()` annotation\n- If `@PartMap()` value is not provided, uses static value from `@Part()` annotation\n- If neither is provided:\n  - `fileName` defaults to the file's actual name (extracted from file path)\n  - `contentType` defaults to `null` (Dio will auto-detect based on file extension)\n\n#### Dynamic Field Names for Multiple Files\n\nUse `@Part()` with `Map\u003CString, File>` to upload multiple files with dynamic field names:\n\n```dart\n  @POST('\u002Fapi\u002Ffiles')\n  @MultiPart()\n  Future\u003Cvoid> uploadFiles(@Part() Map\u003CString, File> files);\n  \n  \u002F\u002F Usage - Upload multiple files with custom field names\n  await client.uploadFiles({\n    'image[0]': File('\u002Fpath\u002Fto\u002Fphoto1.jpg'),\n    'image[1]': File('\u002Fpath\u002Fto\u002Fphoto2.jpg'),\n    'document': File('\u002Fpath\u002Fto\u002Freport.pdf'),\n  });\n```\n\nThis feature also supports:\n- `Map\u003CString, MultipartFile>` - For files already wrapped in MultipartFile\n- `Map\u003CString, List\u003Cint>>` - For raw byte data\n- Nullable maps: `Map\u003CString, File>?`\n\n**Use cases:**\n- Uploading arrays of files where each file needs a unique indexed name (e.g., `image[0]`, `image[1]`)\n- Uploading files to endpoints that require specific field names determined at runtime\n- Sending multiple files of different types in a single request\n\n### Get original HTTP response\n\n```dart\n  @GET('\u002Ftasks\u002F{id}')\n  Future\u003CHttpResponse\u003CTask>> getTask(@Path('id') String id);\n\n  @GET('\u002Ftasks')\n  Future\u003CHttpResponse\u003CList\u003CTask>>> getTasks();\n```\n\n### Streaming and Server-Sent Events (SSE)\n\nRetrofit supports streaming responses using `@DioResponseType(ResponseType.stream)`. When using this annotation, the return type **must** be either `Stream\u003CUint8List>` (for raw bytes) or `Stream\u003CString>` (for text).\n\n```dart\nimport 'dart:convert';\nimport 'dart:typed_data';\nimport 'package:dio\u002Fdio.dart' hide Headers;\nimport 'package:retrofit\u002Fretrofit.dart';\n\n@RestApi(baseUrl: 'https:\u002F\u002Fapi.example.com')\nabstract class RestClient {\n  factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n\n  \u002F\u002F For binary data (images, files, etc.)\n  @GET('\u002Fdownload\u002Ffile')\n  @DioResponseType(ResponseType.stream)\n  Stream\u003CUint8List> downloadFile();\n\n  \u002F\u002F For text data (SSE, NDJSON, etc.)\n  @GET('\u002Fevents')\n  @DioResponseType(ResponseType.stream)\n  Stream\u003CString> getServerSentEvents();\n}\n```\n\n**Note:** When using `Stream\u003CString>`, make sure to import `dart:convert` in your source file.\n\n#### Server-Sent Events (SSE)\n\nFor SSE support, you can use the [simple_sse](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fsimple_sse) package to parse the stream:\n\n```yaml\ndependencies:\n  simple_sse: ^2.0.0\n```\n\n```dart\nimport 'package:simple_sse\u002Fsimple_sse.dart';\n\nfinal client = RestClient(dio);\n\n\u002F\u002F Get the string stream and transform it to SSE events\nfinal eventStream = client\n    .getServerSentEvents()\n    .transform(const LineSplitter())\n    .transform(const SseEventTransformer());\n\nawait for (final event in eventStream) {\n  print('Event: ${event.event}');\n  print('Data: ${event.data}');\n  print('ID: ${event.id}');\n}\n```\n\n### HTTP Header\n\n* Add a HTTP header from the parameter of the method\n\n```dart\n  @GET('\u002Ftasks')\n  Future\u003CTask> getTasks(@Header('Content-Type') String contentType);\n ```\n\n* Add static HTTP headers\n\n```dart\n  import 'package:dio\u002Fdio.dart' hide Headers;\n\n  \u002F\u002F ...\n  \n  @GET('\u002Ftasks')\n  @Headers(\u003CString, dynamic>{\n    'Content-Type': 'application\u002Fjson',\n    'Custom-Header': 'Your header',\n  })\n  Future\u003CTask> getTasks();\n```\n\n* Add global HTTP headers to all requests in the API\n\nYou can define headers at the `@RestApi` level that will be automatically included in all requests:\n\n```dart\n  @RestApi(\n    baseUrl: 'https:\u002F\u002Fapi.example.com',\n    headers: {\n      'User-Agent': 'MyApp\u002F1.0.0',\n      'X-Platform': 'mobile',\n    },\n  )\n  abstract class ApiService {\n    factory ApiService(Dio dio, {String? baseUrl}) = _ApiService;\n\n    \u002F\u002F This request will automatically include User-Agent and X-Platform headers\n    @GET('\u002Fusers')\n    Future\u003CList\u003CUser>> getUsers();\n\n    \u002F\u002F You can add method-specific headers that combine with global headers\n    @GET('\u002Fprofile')\n    @Headers(\u003CString, dynamic>{'Authorization': 'Bearer token'})\n    Future\u003CUser> getProfile();\n\n    \u002F\u002F Method-level headers override global headers with the same key\n    @GET('\u002Fsettings')\n    @Headers(\u003CString, dynamic>{'X-Platform': 'web'})\n    Future\u003CSettings> getSettings();\n  }\n```\n\n**Note:** Method-level headers (via `@Headers` or `@Header` parameter) will override global headers if they have the same key.\n\n\n\n### Error Handling\n\n`catchError(Object)` can be used for capturing the exception and failed response. You can get the detailed response info from `DioError.response`.\n\n```dart\nclient.getTask('2').then((it) {\n  logger.i(it);\n}).catchError((obj) {\n  \u002F\u002F non-200 error goes here.\n  switch (obj.runtimeType) {\n    case DioException:\n      \u002F\u002F Here's the sample to get the failed response error code and message\n      final res = (obj as DioException).response;\n      logger.e('Got error : ${res.statusCode} -> ${res.statusMessage}');\n      break;\n  default:\n    break;\n  }\n});\n```\n\n\nErrors can also be caught and handled at the client level using CallAdapters. For example:\n\n```dart\nclass ErrorAdapter\u003CT> extends CallAdapter\u003CFuture\u003CT>, Future\u003CT>> {\n  @override\n  Future\u003CT> adapt(Future\u003CT> Function() call) {\n    try {\n      return call();\n    } catch (exception) {\n      \u002F\u002F Handle the exception and throw whatever exception you want\n      throw MyCustomException();\n    }\n  }\n}\n\n@RestApi(callAdapter: ErrorAdapter)\nabstract class RestClient {\n  factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n\n  @GET('\u002Fuser')\n  Future\u003CUser> getUser();\n}\n```\n\nIf you need to handle errors individually per API method instead of at the client level:\n\n``` dart\n@RestApi()\nabstract class RestClient {\n  factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n\n  @GET('\u002Fuser')\n  @UseCallAdapter(ErrorAdapter)\n  Future\u003CUser> getUser();\n}\n```\n\n\n\n### Relative API baseUrl\n\nIf you want to use a relative `baseUrl` value in the `RestApi` annotation of the `RestClient`, you need to specify a `baseUrl` in `dio.options.baseUrl`.\n\n```dart\n@RestApi(baseUrl: '\u002Ftasks')\nabstract class RestClient {\n  factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n\n  @GET('{id}')\n  Future\u003CHttpResponse\u003CTask>> getTask(@Path('id') String id);\n\n  @GET('')\n  Future\u003CHttpResponse\u003CList\u003CTask>>> getTasks();\n}\n\ndio.options.baseUrl = 'https:\u002F\u002F5d42a6e2bc64f90014a56ca0.mockapi.io\u002Fapi\u002Fv1';\nfinal client = RestClient(dio);\n```\n\n### Call Adapter\n\nThis feature allows you to adapt the return type of a network call from one type to another.\n\nFor example:\nFuture\u003CUser> → Future\u003CResult\u003CUser>>\n\nThis feature provides flexibility in handling API responses, enabling better integration with custom response wrappers or error handling libraries.\n\nThe CallAdapter takes the original return type R and transforms it into a new type T. This is particularly useful when working with response wrappers like Either, Result, or ApiResponse.\n\nBelow is an example using a custom CallAdapter with a Result wrapper:\n```dart\n  class MyCallAdapter\u003CT> extends CallAdapter\u003CFuture\u003CT>, Future\u003CResult\u003CT>>> {\n    @override\n    Future\u003CResult\u003CT>> adapt(Future\u003CT> Function() call) async {\n      try {\n        final response = await call();\n        return Result\u003CT>.ok(response);\n      } catch (e) {\n        return Result.err(e.toString());\n      }\n    }\n  }\n\n  @RestApi(callAdapter: MyCallAdapter)\n  abstract class RestClient {\n    factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n\n    @GET('\u002F')\n    Future\u003CResult\u003CUser>> getUser();\n  }\n```\n\n### Multiple endpoints support\n\nIf you want to use multiple endpoints to your `RestClient`, you should pass your base url when you initiate `RestClient`. Any value defined in `RestApi` will be ignored.\n\n```dart\n@RestApi(baseUrl: 'this url will be ignored if baseUrl is passed')\nabstract class RestClient {\n  factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n}\n\nfinal client = RestClient(dio, baseUrl: 'your base url');\n```\n\nIf you want to use the base url from `dio.option.baseUrl`, which has lowest priority, please don't pass any parameter to `RestApi` annotation and `RestClient`'s structure method.\n\n### Multithreading (Flutter only)\n\nIf you want to parse models on a separate thread, you can take advantage of the `compute` function, just like Dio does when converting String data responses into json objects.\n\nFor each model that you use you will need to define 2 top-level functions:\n```dart\nFutureOr\u003CTask> deserializeTask(Map\u003CString, dynamic> json);\nFutureOr\u003Cdynamic> serializeTask(Task object);\n```\n\nIf you want to handle lists of objects, either as return types or parameters, you should provide List counterparts:\n\n```dart\nFutureOr\u003CList\u003CTask>> deserializeTaskList(Map\u003CString, dynamic> json);\nFutureOr\u003Cdynamic> serializeTaskList(List\u003CTask> objects);\n```\n\nFinally, make sure you set your `@RestApi` to use the `Parser.FlutterCompute` parser:\n\n```dart\n@RestApi(parser: Parser.FlutterCompute)\n```\n\nE.g.\n```dart\n@RestApi(\n  baseUrl: 'https:\u002F\u002F5d42a6e2bc64f90014a56ca0.mockapi.io\u002Fapi\u002Fv1\u002F',\n  parser: Parser.FlutterCompute,\n)\nabstract class RestClient {\n  factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n\n  @GET('\u002Ftask')\n  Future\u003CTask> getTask();\n\n  @GET('\u002Ftasks')\n  Future\u003CList\u003CTask>> getTasks();\n\n  @POST('\u002Ftask')\n  Future\u003Cvoid> updateTasks(Task task);\n\n  @POST('\u002Ftasks')\n  Future\u003Cvoid> updateTasks(List\u003CTask> tasks);\n}\n\nTask deserializeTask(Map\u003CString, dynamic> json) => Task.fromJson(json);\n\nList\u003CTask> deserializeTaskList(List\u003CMap\u003CString, dynamic>> json) =>\n    json.map((e) => Task.fromJson(e)).toList();\n\nMap\u003CString, dynamic> serializeTask(Task object) => object.toJson();\n\nList\u003CMap\u003CString, dynamic>> serializeTaskList(List\u003CTask> objects) =>\n    objects.map((e) => e.toJson()).toList();\n```\n\nN.B.\nAvoid using Map values, otherwise multiple background isolates will be spawned to perform the computation, which is extremely intensive for Dart.\n\n```dart\nabstract class RestClient {\n  factory RestClient(Dio dio, {String? baseUrl}) = _RestClient;\n\n  \u002F\u002F BAD\n  @GET('\u002Ftasks')\n  Future\u003CMap\u003CString, Task>> getTasks();\n\n  @POST('\u002Ftasks')\n  Future\u003Cvoid> updateTasks(Map\u003CString, Task> tasks);\n\n  \u002F\u002F GOOD\n  @GET('\u002Ftasks_names')\n  Future\u003CTaskNames> getTaskNames();\n\n  @POST('\u002Ftasks_names')\n  Future\u003Cvoid> updateTasks(TaskNames tasks);\n}\n\nTaskNames deserializeTaskNames(Map\u003CString, dynamic> json) =>\n    TaskNames.fromJson(json);\n\n@JsonSerializable\nclass TaskNames {\n  const TaskNames({required this.taskNames});\n\n  final Map\u003CString, Task> taskNames;\n\n  factory TaskNames.fromJson(Map\u003CString, dynamic> json) =>\n      _$TaskNamesFromJson(json);\n}\n```\n\n### Hide generated files\n\nFor the project not to be confused with the files generated by the retrofit you can hide them.\n\n##### Android studio\n\n`File -> Settings -> Editor -> File Types`\n\nAdd \"ignore files and folders\"\n\n`*.g.dart`\n\n## Videos\n- [Flutter Rest API - Simplifying Make API Call Using Retrofit](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=zjNhlmue5Os)\n- [Flutter retrofit implementation | Flutter Network Calls | Source Code In Desc | flutter coding](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=OZF9mqKbi3k)\n- [Flutter retrofit api call | GET | amplifyabhi ](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=ARIy5OSIspQ)\n- [Flutter - Retrofit Setup & Explanation | Clean Architecture | In Hindi](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=e6JV-t9Yo3U)\n- [How to call API using retrofit in flutter application and JSON parsing ?](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=UDhRvP1Iafc)\n- [API Integration in Flutter using Retrofit | Flutter Package Tutorial](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=upX9T_ciWz4&t=39s)\n- [Build A News App - Make Request To API Using Retrofit | PART 4 - Flutter Clean Architecture](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=kjMoW4cs2kU)\n\n\n## Credits\n\n- [JetBrains](https:\u002F\u002Fwww.jetbrains.com\u002F). Thanks for providing the great IDE tools.\n\n\n## Contributors ✨\n\nThanks goes to these wonderful people:\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftrevorwang\u002Fretrofit.dart\u002Fgraphs\u002Fcontributors\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fretrofitdart\u002Fcontributors.svg?width=890&button=false\" \u002F>\u003C\u002Fa>\n\nContributions of any kind welcome!\n## Activities\n\n![Alt](https:\u002F\u002Frepobeats.axiom.co\u002Fapi\u002Fembed\u002F76948dfe0698cce4724567ccbf38139823939350.svg \"Repobeats analytics image\")\n","retrofit.dart 是一个基于 dio 的客户端生成器，使用 source_gen 技术并受到 Chopper 和 Retrofit 的启发。该项目通过定义接口和数据模型自动生成 HTTP 客户端代码，支持类型安全的请求与响应处理，并且能够简化网络请求逻辑的编写。其核心功能包括自动化的 API 接口生成、灵活的配置选项以及对 JSON 序列化\u002F反序列化的支持。适用于需要进行 RESTful 服务交互的 Dart 或 Flutter 项目中，尤其是当开发者希望减少手动编写网络层代码的工作量时。",2,"2026-06-11 03:22:35","top_language"]