dio_result_handler 1.0.1
dio_result_handler: ^1.0.1 copied to clipboard
A lightweight Flutter package for simplified API handling using Dio, with built-in success & failure result wrapping via ApiResult.
example/lib/main.dart
import 'package:dio_result_handler/dio_result_handler.dart';
import 'package:flutter/material.dart';
void main() {
DioApiHandler.init(
config: DioApiHandlerConfig(
baseUrl: () => "https://jsonplaceholder.typicode.com",
token: () => null, // Optional
onError: (dynamic error, int? statusCode) {
debugPrint("Show Error pop up or message");
},
),
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'API Handler Demo',
theme: ThemeData(colorScheme: .fromSeed(seedColor: Colors.deepPurple)),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
fetchUsers();
}
Future<void> fetchUsers () async{
final res = await callApi();
switch (res) {
case ApiSuccess():
users = res.data;
break;
case ApiFailure():
error = res.message;
debugPrint(res.errorDetails);
}
setState(() {});
}
String? error;
List<User> users = [];
Future<ApiResult<List<User>>> callApi () {
return ApiHandler.request(
request: () => ApiClient.dio.get("/users"),
response: (data) => (data as List<dynamic>).map((e) => User.fromJson(e)).toList(),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text("API Handler"),
),
body: Builder(
builder: (context) {
if (error != null) {
return Center(
child: Text(error!),
);
}
if (users.isEmpty) {
return Center(
child: CircularProgressIndicator(),
);
}
return Center(
child: Text("Total Users: ${users.length}")
);
}
),
floatingActionButton: FloatingActionButton(
onPressed: fetchUsers,
tooltip: 'Fetch API',
child: const Icon(Icons.http),
),
);
}
}
class User {
int? id;
String? name;
String? username;
String? email;
Address? address;
String? phone;
String? website;
Company? company;
User(
{this.id,
this.name,
this.username,
this.email,
this.address,
this.phone,
this.website,
this.company});
User.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
username = json['username'];
email = json['email'];
address =
json['address'] != null ? Address.fromJson(json['address']) : null;
phone = json['phone'];
website = json['website'];
company =
json['company'] != null ? Company.fromJson(json['company']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['username'] = username;
data['email'] = email;
if (address != null) {
data['address'] = address!.toJson();
}
data['phone'] = phone;
data['website'] = website;
if (company != null) {
data['company'] = company!.toJson();
}
return data;
}
}
class Address {
String? street;
String? suite;
String? city;
String? zipcode;
Geo? geo;
Address({this.street, this.suite, this.city, this.zipcode, this.geo});
Address.fromJson(Map<String, dynamic> json) {
street = json['street'];
suite = json['suite'];
city = json['city'];
zipcode = json['zipcode'];
geo = json['geo'] != null ? Geo.fromJson(json['geo']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['street'] = street;
data['suite'] = suite;
data['city'] = city;
data['zipcode'] = zipcode;
if (geo != null) {
data['geo'] = geo!.toJson();
}
return data;
}
}
class Geo {
String? lat;
String? lng;
Geo({this.lat, this.lng});
Geo.fromJson(Map<String, dynamic> json) {
lat = json['lat'];
lng = json['lng'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['lat'] = lat;
data['lng'] = lng;
return data;
}
}
class Company {
String? name;
String? catchPhrase;
String? bs;
Company({this.name, this.catchPhrase, this.bs});
Company.fromJson(Map<String, dynamic> json) {
name = json['name'];
catchPhrase = json['catchPhrase'];
bs = json['bs'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['name'] = name;
data['catchPhrase'] = catchPhrase;
data['bs'] = bs;
return data;
}
}