duckma_client 0.0.4
duckma_client: ^0.0.4 copied to clipboard
An interface with an adapter layer which tries to consume Dio with efficiency and smartly.
// Copyright (c) 2022 DuckMa Srl. All rights reserved.
// Use of this source code is governed by a MIT-style license that can be
// found in the LICENSE file.
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:dio/dio.dart';
import 'package:duckma_client/duckma_client.dart';
import 'package:example/user/model/user/user_model.dart';
import 'package:example/user_detail.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: UsersScreen(),
);
}
}
class UsersScreen extends StatefulWidget {
const UsersScreen({Key? key}) : super(key: key);
@override
State<UsersScreen> createState() => _UsersScreenState();
}
class _UsersScreenState extends State<UsersScreen> {
late HttpClient _client;
final List<UserModel?> _users = [];
Future<void> getAllUsers() async {
final Response<List> response = await _client.get(
Uri(path: '/users'),
);
final List<UserModel> model =
response.body.map((e) => UserModel.fromJson(e)).toList();
_users.addAll(model);
setState(() {});
}
void onNavToDetail(int index) {
if (_users[index] != null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UserDetailScreen(userModel: _users[index]!);
},
),
);
}
}
@override
void initState() {
super.initState();
Dio dio = Dio();
dio.options.baseUrl = 'https://jsonplaceholder.typicode.com';
final connectivity = Connectivity();
final requestRetrier = RequestRetrier(dio);
final connectivityRequestRetrier = ConnectivityRequestRetrier(
requestRetrier,
connectivity,
);
_client = HttpClient(
dio,
connectivityRequestRetrier: connectivityRequestRetrier,
);
getAllUsers();
}
@override
void dispose() {
super.dispose();
_client.close();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Users'),
),
body: ListView.builder(
itemCount: _users.length,
itemBuilder: (BuildContext context, int index) {
final UserModel? user = _users[index];
if (user != null) {
return ListTile(
leading: Text(user.id.toString()),
title: Text(user.name),
subtitle: Text(user.email),
onTap: () => onNavToDetail(index),
);
}
return const Center(
child: Text('Error to the user'),
);
},
),
);
}
}