dio_result_handler 1.0.0 copy "dio_result_handler: ^1.0.0" to clipboard
dio_result_handler: ^1.0.0 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;
  }
}
2
likes
0
points
32
downloads

Publisher

verified publisherkhatrihub.site

Weekly Downloads

A lightweight Flutter package for simplified API handling using Dio, with built-in success & failure result wrapping via ApiResult.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

dio, flutter

More

Packages that depend on dio_result_handler