api_request 0.8.5
api_request: ^0.8.5 copied to clipboard

api request for handle call api. every request is an action has execute method.

example/lib/main.dart

import 'package:api_request/api_request.dart';
import 'package:flutter/material.dart';

class Post {
  final int id;
  final int userId;
  final String title;
  final String body;
  const Post({
    required this.id,
    required this.userId,
    required this.title,
    required this.body,
  });

  @override
  String toString() {
    return 'Post{' +
        ' id: $id,' +
        ' userId: $userId,' +
        ' title: $title,' +
        ' body: $body,' +
        '}';
  }

  factory Post.fromMap(Map<String, dynamic> map) {
    return Post(
      id: map['id'],
      userId: map['userId'],
      title: map['title'],
      body: map['body'],
    );
  }
}

class PostsResponse {
  List<Post>? posts;
  PostsResponse({this.posts});

  PostsResponse.fromList(List<dynamic>? data) {
    if (data is List) {
      this.posts = <Post>[];
      data.forEach((item) => this.posts?.add(Post.fromMap(item)));
    }
  }
}

class PostsRequestAction extends ApiRequestAction<PostsResponse> {
  @override
  bool get authRequired => false;

  @override
  String get path => 'posts';

  @override
  RequestMethod get method => RequestMethod.GET;

  @override
  ResponseBuilder<PostsResponse> get responseBuilder =>
      (list) => PostsResponse.fromList(list);

  @override
  ErrorHandler get onError => (error) {
        print("Error Response $error");
      };
}

class PostRequestAction extends ApiRequestAction<Post> {
  final int? id;
  PostRequestAction({this.id});

  @override
  bool get authRequired => false;

  @override
  String get path => 'posts/$id';

  @override
  RequestMethod get method => RequestMethod.GET;

  @override
  ResponseBuilder<Post> get responseBuilder => (map) => Post.fromMap(map);

  @override
  Function get onInit => () => print('Action Init');

  @override
  Function get onStart => () => print('Action Start');

  @override
  SuccessHandler<Post> get onSuccess =>
      (post) => print('Action Success ${post?.id}');

  @override
  ErrorHandler get onError => (error) => print('Action Error ${error.message}');
}

String yourMethodToGetToken() {
  return '1|hfkf9rfynfuynyf89erfynrfyepiruyfp';
}

Future<String> yourAysncMethodToGetToken() async {
  return '1|hfkf9rfynfuynyf89erfynrfyepiruyfp';
}

void main() {
  //config api requests;
  ApiRequestOptions.instance?.config(
    /// set base url for all request
    baseUrl: 'https://jsonplaceholder.typicode.com/',

    /// set token type to 'Bearer '
    tokenType: ApiRequestOptions.bearer,

    /// set token as string api request action will with is if auth is required
    token: '1|hfkf9rfynfuynyf89erfynrfyepiruyfp',

    /// we will call this method to get token in run time -- method must be return string
    getToken: () => yourMethodToGetToken(),

    /// we will call this method to get token in run time -- method must be return Future<string>
    getAsyncToken: () => yourAysncMethodToGetToken(),

    /// send default query params for all requests
    //defaultQueryParameters: {'locale': 'ar'},
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Api Request Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Api Request Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Post>? posts = <Post>[];
  final PostsRequestAction? action = PostsRequestAction();

  @override
  initState() {
    super.initState();
    action?.onQueue();
  }

  _getPostData(int? id) {
    PostRequestAction action = PostRequestAction(id: id);
    // use action events setter
    action.onStart = () => print('Action Start Form Ui');
    action.onSuccess = (post) => print('Action Success Form Ui ${post?.id}');
    action.onError = (error) => print('Action Error Form Ui ${error.message}');

    // use action subscribe
    action.subscribe(
      onSuccess: (response) {
        print('response Post Id: ${response?.id}');
      },
      onError: (error) {
        if (error is ApiRequestError) {
          print("response Error ${error.message}");
        }
      },
      onDone: () {
        print("Hi I done");
      },
    );
    action.onQueue();
  }

  getReport() {
    print("${ApiRequestPerformance.instance?.actionsReport}");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
          child: StreamBuilder<PostsResponse?>(
        stream: action?.stream,
        builder: (_, snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
                itemCount: snapshot.data?.posts?.length,
                itemBuilder: (_, index) => ListTile(
                      title: Text(snapshot.data?.posts?[index].title ?? ''),
                      onTap: () =>
                          _getPostData(snapshot.data?.posts?[index].id),
                    ));
          }
          return CircularProgressIndicator();
        },
      )
          /*child: (posts?.isNotEmpty ?? false)
            ? ListView.builder(
                itemCount: posts?.length,
                itemBuilder: (_, index) => ListTile(
                      title: Text(posts?[index].title ?? ''),
                      onTap: () => _getPostData(posts?[index].id),
                    ))
            : CircularProgressIndicator(),*/
          ),
      floatingActionButton: FloatingActionButton(
        onPressed: getReport,
        child: Icon(Icons.report),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}
4
likes
130
pub points
42%
popularity

api request for handle call api. every request is an action has execute method.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (LICENSE)

Dependencies

dio, flutter

More

Packages that depend on api_request