RetroMacrofit for Dart
macrofit is a type conversion dio client generator based on macro feature and inspired by retrofit.dart.
Setup
Since macro is not stable yet, you need to enable it in your analysis_options.yaml
:
include: package:flutter_lints/flutter.yaml
analyzer:
enable-experiment:
- macros
Also you need use flag --enable-experiment=macros
when running your app:
dart run --enable-experiment=macros example/lib/example.dart
Usage
Client
Create your client:
@RestClient()
class ClientExample {
ClientExample(this._dio, [this.baseUrl]);
}
Queries
Fill client with your queries. E.g.:
@RestClient()
class ClientExample {
ClientExample(this._dio, [this.baseUrl]);
@MultiPart('some/path')
external Future<void> someRequest(
@Part() String id,
@Part() File photo,
@Part(as: 'user_info') UserInfo userInfo,
);
@POST('/posts/{userId}')
external Future<void> updateProfile(
@Header('Test') String testHeader,
@Body() String name,
@Body(as: 'user_name') String username,
String userId,
);
@DELETE('/posts/{id}')
external Future<TestResponse> deletePost(
@Header('Test') String id,
);
@GET('/posts')
external Future<List<double>> getPosts(
@Query() int page,
@Query(as: 'limit') int perPage,
);
}
Methods
This library supports GET
, POST
, PUT
, DELETE
methods. Also you can define your own:
@Custom('/posts/{id}', methodName: 'PATCH')
external Future<PostEntity> patchPost(int id, @Body() String title);
Parameters
You can use:
@Query
for query parameters (e.g.?page=1&limit=10
)
@GET('/posts')
external Future<List<double>> getPosts(
@Query() int page,
@Query() int limit,
);
@Body
for request body. E.g:
@POST('/posts')
external Future<void> newPost(
@Body() String title,
@Body() String body,
);
@Header
for headers. E.g:
@GET('/posts')
external Future<PostEntity> translate(
@Header('Locale') String locale,
);
@Part
for multi-part requests. E.g:
@MultiPart('/posts')
external Future<void> newPost(
@Part() String title,
@Part() File photo,
);
@Path
for path parameters. Make sure to use the same name in the method and in the path. E.g:
@GET('/posts/{id}')
external Future<PostEntity> getPost(int id);