{"id":15066424,"url":"https://github.com/nggepe/http_cache_flutter","last_synced_at":"2025-04-10T13:42:48.452Z","repository":{"id":63514039,"uuid":"545472122","full_name":"nggepe/http_cache_flutter","owner":"nggepe","description":"cacheable http request with interactive widget.","archived":false,"fork":false,"pushed_at":"2023-02-08T11:41:57.000Z","size":419,"stargazers_count":5,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-24T12:21:45.058Z","etag":null,"topics":["cache","dart","flutter","flutter-package","http"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nggepe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-04T12:36:52.000Z","updated_at":"2024-07-17T06:26:13.000Z","dependencies_parsed_at":"2025-02-17T10:41:39.573Z","dependency_job_id":null,"html_url":"https://github.com/nggepe/http_cache_flutter","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nggepe%2Fhttp_cache_flutter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nggepe%2Fhttp_cache_flutter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nggepe%2Fhttp_cache_flutter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nggepe%2Fhttp_cache_flutter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nggepe","download_url":"https://codeload.github.com/nggepe/http_cache_flutter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248226257,"owners_count":21068170,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cache","dart","flutter","flutter-package","http"],"created_at":"2024-09-25T01:07:58.111Z","updated_at":"2025-04-10T13:42:48.429Z","avatar_url":"https://github.com/nggepe.png","language":"Dart","readme":"# HTTP Cache Flutter\n\n\u003cdiv style=\"text-align: center;\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/nggepe/http_cache_flutter/master/doc/bee-hive.png\" style=\"max-width: 100%\" /\u003e\n\u003c/div\u003e\n\n[![codecov](https://codecov.io/gh/nggepe/http_cache_flutter/branch/master/graph/badge.svg?token=XJ6CGLNBHY)](https://codecov.io/gh/nggepe/http_cache_flutter)\n[![pub package](https://img.shields.io/pub/v/http_cache_flutter.svg)](https://pub.dev/packages/http_cache_flutter)\n[![code analyze](https://github.com/nggepe/http_cache_flutter/actions/workflows/code-analyze.yml/badge.svg)](https://github.com/nggepe/http_cache_flutter/actions/workflows/code-analyze.yml)\n\n# Overview\n\nThe goal of this library is to make it easier for us to handle http requests and data caching by using interactive widgets. If you need any update or tutorial, please create an issue (here)[https://github.com/nggepe/http_cache_flutter/issues]\n\n## HttpCache Widget class\n\n[More complete `HttpCache` Widget documentation is here](https://github.com/nggepe/http_cache_flutter/tree/master/doc/http_cache_widget.md)\n\n# Storage Initialization\n\nBefore implement this library, you should initialize the storage.\nIn your `main.dart` flutter file 👇🏻\n\n```dart\nimport 'package:http_cache_flutter/http_cache_flutter.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/foundation.dart';\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  await HttpCache.init(\n      storageDirectory: kIsWeb\n          ? HttpCacheStorage.webStorageDirectory\n          : await getTemporaryDirectory());\n  runApp(const MyApp());\n}\n```\n\n[More complete `HttpCache` Widget documentation is here](https://github.com/nggepe/http_cache_flutter/tree/master/doc/http_cache_widget.md)\n\n# Clear Storage\n\n```dart\nHttpCache.storage.clear();\n```\n\n# How to remove cache?\n\nYou can use string pattern to remove your some url group\n\n```dart\n\nHttpCache.storage.invalidate(\"https://example.com\");\n\n```\n\n# Usage Example\n\n```dart\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:http_cache_flutter/http_cache_flutter.dart';\nimport 'package:path_provider/path_provider.dart';\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  await HttpCache.init(\n      storageDirectory: kIsWeb\n          ? HttpCacheStorage.webStorageDirectory\n          : await getTemporaryDirectory());\n  runApp(const MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({Key? key}) : super(key: key);\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Demo',\n      theme: ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: const MyHomePage(title: 'Flutter Demo Home Page'),\n    );\n  }\n}\n\nclass MyHomePage extends StatefulWidget {\n  const MyHomePage({Key? key, required this.title}) : super(key: key);\n\n  final String title;\n\n  @override\n  State\u003cMyHomePage\u003e createState() =\u003e _MyHomePageState();\n}\n\nclass _MyHomePageState extends State\u003cMyHomePage\u003e {\n  final url = \"https://api.github.com/search/repositories?q=\";\n  @override\n  Widget build(BuildContext context) {\n    return HttpCache\u003cList\u003cGithubRepository\u003e\u003e(\n        url: \"${url}nggepe/http_cache_flutter\",\n        log: const HttpLog(showLog: true),\n        refactorBody: (body, decodedBody) {\n          var items = decodedBody['items'] as List?;\n          return items?.map((e) {\n                return GithubRepository.fromMap(e);\n              }).toList() ??\n              [];\n        },\n        builder: (_, data) {\n          return Scaffold(\n            appBar: AppBar(\n              title: Text(widget.title),\n              bottom: PreferredSize(\n                  child: Padding(\n                    padding: const EdgeInsets.symmetric(horizontal: 16),\n                    child: Row(\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      children: [\n                        TextButton(\n                          onPressed: () {\n                            data.changeUrl(\"${url}flutter/flutter\");\n                          },\n                          child: const Text(\n                            \"flutter/flutter\",\n                            style: TextStyle(color: Colors.white),\n                          ),\n                          style: ButtonStyle(\n                              backgroundColor:\n                                  MaterialStateProperty.resolveWith(\n                            (states) =\u003e Colors.green,\n                          )),\n                        ),\n                        const SizedBox(width: 20),\n                        TextButton(\n                          onPressed: () {\n                            data.changeUrl(\"${url}flutter/engine\");\n                          },\n                          child: const Text(\n                            \"flutter/engine\",\n                            style: TextStyle(color: Colors.white),\n                          ),\n                          style: ButtonStyle(\n                              backgroundColor:\n                                  MaterialStateProperty.resolveWith(\n                            (states) =\u003e Colors.green,\n                          )),\n                        ),\n                      ],\n                    ),\n                  ),\n                  preferredSize: Size(MediaQuery.of(context).size.width, 50)),\n            ),\n            body: Center(\n              child: data.isLoading\n                  ? const CircularProgressIndicator()\n                  : ListView(\n                      children: [\n                        Column(\n                          children: data.refactoredBody\n                                  ?.map(\n                                    (e) =\u003e Padding(\n                                      padding: const EdgeInsets.symmetric(\n                                          vertical: 16, horizontal: 8),\n                                      child: Column(\n                                        children: [\n                                          Text(e.name),\n                                          Text(e.fullName),\n                                        ],\n                                      ),\n                                    ),\n                                  )\n                                  .toList() ??\n                              [],\n                        ),\n                        TextButton(\n                            onPressed: data.fetchWithLoading,\n                            child: const Text('fetch')),\n                      ],\n                    ),\n            ),\n            floatingActionButton: FloatingActionButton(\n                onPressed: data.fetchWithLoading,\n                child: const Icon(Icons.refresh)),\n          );\n        });\n  }\n}\n\nclass GithubRepository {\n  final String nodeId;\n  final String name;\n  final String fullName;\n\n  const GithubRepository(\n      {required this.nodeId, required this.name, required this.fullName});\n\n  factory GithubRepository.fromMap(Map\u003cString, dynamic\u003e map) {\n    return GithubRepository(\n      nodeId: map['node_id'],\n      name: map['name'],\n      fullName: map['full_name'],\n    );\n  }\n}\n```\n\n# Update Coming Soon\n\n## HttpCachePaged Widget\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Feature\n      \u003c/td\u003e\n      \u003ctd\u003e\n        Status\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Persistent Cache Storage\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Handle Change URL\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Handle stale data\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Handle log\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Handle timeout cache\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Handle Data Mutation\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Paged http cache\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Dev tool\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\n        Paging\n      \u003c/td\u003e\n      \u003ctd\u003e\n        ⏳\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnggepe%2Fhttp_cache_flutter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnggepe%2Fhttp_cache_flutter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnggepe%2Fhttp_cache_flutter/lists"}