import 'dart:async'; import 'dart:convert'; import 'package:filesize/filesize.dart'; import 'package:flutter/material.dart'; import 'package:jiffy/jiffy.dart'; import 'package:localstore/localstore.dart'; import '../../../widget/placeholder_view.dart'; import '../../api/request_cache.dart'; import 'json_viewer.dart'; class CacheView extends StatefulWidget { const CacheView({super.key}); @override State createState() => _CacheViewState(); Future clear() async { await Localstore.instance.collection(RequestCache.collection).delete(); } Future totalSize() async { final data = await Localstore.instance.collection(RequestCache.collection).get(); if (data == null || data.isEmpty) return 0; return data.values.fold(0, (sum, value) => sum + jsonEncode(value).length) * 8; } } class _CacheViewState extends State { final Localstore storage = Localstore.instance; late Future?> files; @override void initState() { files = Localstore.instance.collection(RequestCache.collection).get(); super.initState(); } @override Widget build(BuildContext context) => Scaffold( appBar: AppBar( title: const Text('Cache storage'), ), body: FutureBuilder( future: files, builder: (context, snapshot) { if(snapshot.hasData) { return ListView.builder( itemCount: snapshot.data!.length, itemBuilder: (context, index) { final key = snapshot.data!.keys.elementAt(index); final element = snapshot.data![key] as Map; final filename = key.split('/').last; return ListTile( leading: const Icon(Icons.text_snippet_outlined), title: Text(filename), subtitle: Text('${filesize(jsonEncode(element).length * 8)}, ${Jiffy.parseFromMillisecondsSinceEpoch(element['lastupdate'] as int).fromNow()}'), trailing: const Icon(Icons.arrow_right), onTap: () => JsonViewer.asDialog(context, jsonDecode(element['json'] as String) as Map), ); }, ); } else if(snapshot.connectionState != ConnectionState.done) { return const Center( child: CircularProgressIndicator() ); } else { return const Center( child: PlaceholderView(icon: Icons.hourglass_empty, text: 'Keine Daten'), ); } }, ), ); } extension FutureExtension on Future { bool isCompleted() { final completer = Completer(); then(completer.complete).catchError(completer.completeError); return completer.isCompleted; } }