Skip to content

Instantly share code, notes, and snippets.

View dev4jam's full-sized avatar

Dev4Jam dev4jam

  • Dev4Jam
  • Sydney
View GitHub Profile
{
"version": "2.0.0",
"tasks": [
{
"label": "flutter: analyze",
"type": "shell",
"command": "flutter",
"group": "build",
"runOptions": {
"instanceLimit": 1,
@dev4jam
dev4jam / main.dart
Created March 20, 2022 22:15
Dart inheritance issue
// Model interface
abstract class JsonConvertible {
Map<String, dynamic> toJson();
JsonConvertible.fromJson(Map<String, dynamic> json);
}
// Model
class AccessTokenResponse extends JsonConvertible {
String? accessToken;
@dev4jam
dev4jam / regular_api_call.dart
Created March 21, 2022 06:39
Regular api call
final dio = Dio()
..options.baseUrl = 'https://www.domain.com/api';
..options.connectTimeout = 5000; // 5 seconds
..options.receiveTimeout = 3000; // 3 seconds
try {
final response = await dio.post('/authenticate', data: {'login': 'user_name', 'password': 'password'});
// Check response then response.data and convert response to your model
} on Dio.DioError catch (error) {
// Handle Dio exceptions here
} catch (error) {
@dev4jam
dev4jam / expected_api_call.dart
Created March 21, 2022 06:41
Expected API call
//Instantiate a service and keep it in your DI container:
final service = NetworkService(baseUrl: 'https://www.domain.com/api');
// Prepare a request:
final request = NetworkRequest(
type: NetworkRequestType.POST,
path: '/authenticate',
data: NetworkRequestBody.json({
'login': 'user_name',
'password': 'password'
}),
@dev4jam
dev4jam / access_token_response.dart
Created March 21, 2022 06:42
AccessTokenResponse
class AccessTokenResponse {
String? accessToken;
AccessTokenResponse.fromJson(Map<String, dynamic> json) {
accessToken = json['access_token'];
}
}
@dev4jam
dev4jam / request_body.dart
Created March 21, 2022 06:43
Request body
import 'package:freezed_annotation/freezed_annotation.dart';
part 'NetworkRequestBody.freezed.dart';
@freezed
class NetworkRequestBody with _$NetworkRequestBody {
const factory NetworkRequestBody.empty() = Empty;
const factory NetworkRequestBody.json(Map<String, dynamic> data) = Json;
const factory NetworkRequestBody.text(String data) = Text;
}
@dev4jam
dev4jam / network_request.dart
Created March 21, 2022 06:43
Network request
enum NetworkRequestType { GET, POST, PUT, PATCH, DELETE }
class NetworkRequest {
const NetworkRequest({
required this.type,
required this.path,
required this.data,
this.queryParams,
this.headers,
});
@dev4jam
dev4jam / network_response.dart
Created March 21, 2022 06:45
Network response
import 'package:freezed_annotation/freezed_annotation.dart';
part 'NetworkResponse.freezed.dart';
@freezed
class NetworkResponse<Model> with _$NetworkResponse {
const factory NetworkResponse.ok(Model data) = Ok;
const factory NetworkResponse.invalidParameters(String message) = InvalidParameters;
const factory NetworkResponse.noAuth(String message) = NoAuth; //401
const factory NetworkResponse.noAccess(String message) = NoAccess; //403
const factory NetworkResponse.badRequest(String message) = BadRequest; //400
const factory NetworkResponse.notFound(String message) = NotFound; //404
@dev4jam
dev4jam / network_service_prototype.dart
Created March 21, 2022 06:45
Network Service Prototype
class NetworkService {
NetworkService({
required this.baseUrl, // Base service url
dioClient, // Prepared Dio instance could be injected
httpHeaders, // Global headers could be provided as well
}) : this._dio = dioClient,
this._headers = httpHeaders ?? {};
Dio? _dio;
final String baseUrl;
Map<String, String> _headers;
@dev4jam
dev4jam / body_union.dart
Created March 21, 2022 06:46
Body union
dynamic body = request.data.whenOrNull(
json: (data) => data,
text: (data) => data,
);