dio_cache_interceptor 2.0.0-beta.6 copy "dio_cache_interceptor: ^2.0.0-beta.6" to clipboard
dio_cache_interceptor: ^2.0.0-beta.6 copied to clipboard

outdated

Dio HTTP cache interceptor with multiple stores respecting HTTP directives (or not).

example/lib/main.dart

import 'dart:io';

import 'package:dio/dio.dart';
import 'package:dio_cache_interceptor/dio_cache_interceptor.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart' as pp;

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String text = '';
  late CacheStore cacheStore;
  late Dio dio;

  @override
  void initState() {
    pp.getApplicationDocumentsDirectory().then((dir) {
      cacheStore = DbCacheStore(databasePath: dir.path, logStatements: true);
      // cacheStore = FileCacheStore(dir.path);

      dio = Dio()
        ..interceptors.add(
          DioCacheInterceptor(options: CacheOptions(store: cacheStore)),
        );
    });

    // or

    // cacheStore = MemCacheStore(maxSize: 10485760, maxEntrySize: 1048576);
    // dio = Dio()
    //   ..interceptors.add(
    //     DioCacheInterceptor(options: CacheOptions(store: cacheStore)),
    //   );

    super.initState();
  }

  @override
  void dispose() async {
    dio.close();
    await cacheStore.close();
    return super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dio cache interceptor',
      home: Scaffold(
        body: SafeArea(
          child: SingleChildScrollView(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                RaisedButton(
                  onPressed: () async => await _cleanStore(),
                  child: Text('Clear store'),
                ),
                RaisedButton(
                  onPressed: () async => await _deleteEntry(),
                  child: Text('Clear single entry'),
                ),
                RaisedButton(
                  onPressed: () async => await _requestFirstCall(),
                  child: Text('Call (Request first policy)'),
                ),
                RaisedButton(
                  onPressed: () async => await _refreshCall(),
                  child: Text('Call (Refresh policy)'),
                ),
                RaisedButton(
                  onPressed: () async => await _cacheFirstCall(),
                  child: Text('Call (Cache first policy)'),
                ),
                RaisedButton(
                  onPressed: () async => await _cacheStoreNoCall(),
                  child: Text('Call (Cache no store policy)'),
                ),
                Text(text),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Future _cacheStoreNoCall() async {
    final resp = await _call(policy: CachePolicy.cacheStoreNo);
    if (resp == null) return;
    setState(() => text = _getResponseContent(resp));
  }

  Future _requestFirstCall() async {
    final resp = await _call();
    if (resp == null) return;
    setState(() => text = _getResponseContent(resp));
  }

  Future _refreshCall() async {
    final resp = await _call(policy: CachePolicy.refresh);
    if (resp == null) return;
    setState(() => text = _getResponseContent(resp));
  }

  Future _cacheFirstCall() async {
    final resp = await _call(policy: CachePolicy.cacheFirst);
    if (resp == null) return;
    setState(() => text = _getResponseContent(resp));
  }

  Future _deleteEntry() async {
    final key = CacheOptions.defaultCacheKeyBuilder(
      RequestOptions(path: 'https://www.wikipedia.org'),
    );
    await cacheStore.delete(key);
    setState(() => text = 'Entry "https://www.wikipedia.org" cleared');
  }

  Future _cleanStore() async {
    await cacheStore.clean();
    setState(() => text = 'Store cleared completely');
  }

  Future<Response> _call({
    String url = 'https://www.wikipedia.org',
    CachePolicy? policy,
  }) async {
    Options? options;
    if (policy != null) {
      options = CacheOptions(store: cacheStore, policy: policy).toOptions();
    }

    try {
      return await dio.get(url, options: options);
    } on DioError catch (err) {
      setState(() => text = err.toString());
      return Future.value(null);
    }
  }

  String _getResponseContent(Response response) {
    final date = response.headers[HttpHeaders.dateHeader]?.first;
    final etag = response.headers[HttpHeaders.etagHeader]?.first;
    final expires = response.headers[HttpHeaders.expiresHeader]?.first;
    final lastModified =
        response.headers[HttpHeaders.lastModifiedHeader]?.first;
    final cacheControl =
        response.headers[HttpHeaders.cacheControlHeader]?.first;

    final buffer = StringBuffer();
    buffer.writeln('');
    buffer.writeln('Call returned ${response.statusCode}\n');

    buffer.writeln('Request headers:');
    buffer.writeln('${response.request.headers.toString()}\n');

    buffer.writeln('Response headers (cache related):');
    if (date != null) {
      buffer.writeln('${HttpHeaders.dateHeader}: $date');
    }
    if (etag != null) {
      buffer.writeln('${HttpHeaders.etagHeader}: $etag');
    }
    if (expires != null) {
      buffer.writeln('${HttpHeaders.expiresHeader}: $expires');
    }
    if (lastModified != null) {
      buffer.writeln('${HttpHeaders.lastModifiedHeader}: $lastModified');
    }
    if (cacheControl != null) {
      buffer.writeln('${HttpHeaders.cacheControlHeader}: $cacheControl');
    }

    buffer.writeln('');
    buffer.writeln('Response body (truncated):');
    buffer.writeln('${response.data.toString().substring(0, 200)}...');

    return buffer.toString();
  }
}
303
likes
0
pub points
98%
popularity

Publisher

verified publisheropenapi4j.org

Dio HTTP cache interceptor with multiple stores respecting HTTP directives (or not).

Repository (GitHub)
View/report issues

License

unknown (LICENSE)

Dependencies

dio, moor, path, uuid

More

Packages that depend on dio_cache_interceptor