deo_emerges 0.3.0 copy "deo_emerges: ^0.3.0" to clipboard
deo_emerges: ^0.3.0 copied to clipboard

Flutter networking on top of Dio. Request deduplication, typed responses, uploads and downloads with progress, caching, retry and clear errors.

example/lib/main.dart

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Deo Emerges Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Deo Emerges Demo Home Page'),
    );
  }
}

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

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final DeoClient _client = DeoClient(
    config: DeoConfig(
      baseUrl: 'https://jsonplaceholder.typicode.com',
      connectTimeout: const Duration(seconds: 10),
      receiveTimeout: const Duration(seconds: 10),
      sendTimeout: const Duration(seconds: 10),
      enableLogging: true,
    ),
  );

  // Response data
  List<dynamic> _posts = [];
  bool _isLoading = false;
  String _error = '';

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  Future<void> _fetchData() async {
    setState(() {
      _isLoading = true;
      _error = '';
    });

    try {
      // Basic GET request
      final response = await _client.get<List<dynamic>>('/posts');
      setState(() {
        _posts = response.data ?? [];
        _isLoading = false;
      });
    } catch (e) {
      setState(() {
        _error = e is DeoError ? e.message : e.toString();
        _isLoading = false;
      });
    }
  }

  Future<void> _createPost() async {
    try {
      final response = await _client.post<Map<String, dynamic>>(
        '/posts',
        data: {
          'title': 'New Post',
          'body': 'This is a new post created with Deo Emerges',
          'userId': 1,
        },
      );

      if (!mounted) return;
      ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Post created: ${response.data?['title']}')));
      _fetchData();
    } catch (e) {
      setState(() {
        _error = e is DeoError ? e.message : e.toString();
      });
    }
  }

  Future<void> _fetchConcurrent() async {
    setState(() {
      _isLoading = true;
      _error = '';
    });

    try {
      // Concurrent requests example
      final responses = await _client.concurrent([
        () => _client.get('/posts/1'),
        () => _client.get('/posts/2'),
        () => _client.get('/posts/3'),
      ]);

      setState(() {
        _isLoading = false;
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
            content: Text('Fetched ${responses.length} posts concurrently')));
      });
    } catch (e) {
      setState(() {
        _error = e is DeoError ? e.message : e.toString();
        _isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: _isLoading
          ? const Center(child: CircularProgressIndicator())
          : _error.isNotEmpty
              ? Center(child: Text('Error: $_error'))
              : ListView.builder(
                  itemCount: _posts.length,
                  itemBuilder: (context, index) {
                    final post = _posts[index];
                    return ListTile(
                      title: Text(post['title']),
                      subtitle: Text(post['body']),
                    );
                  },
                ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: _fetchData,
            tooltip: 'Fetch Data',
            child: const Icon(Icons.refresh),
          ),
          const SizedBox(height: 10),
          FloatingActionButton(
            onPressed: _createPost,
            tooltip: 'Create Post',
            child: const Icon(Icons.add),
          ),
          const SizedBox(height: 10),
          FloatingActionButton(
            onPressed: _fetchConcurrent,
            tooltip: 'Fetch Concurrent',
            child: const Icon(Icons.flash_on),
          ),
        ],
      ),
    );
  }
}
1
likes
160
points
135
downloads

Documentation

API reference

Publisher

verified publishertisankan.dev

Weekly Downloads

Flutter networking on top of Dio. Request deduplication, typed responses, uploads and downloads with progress, caching, retry and clear errors.

Repository (GitHub)
View/report issues

License

MIT (license)

Dependencies

crypto, dio, flutter

More

Packages that depend on deo_emerges