import 'dart:convert'; import 'dart:developer'; import 'dart:math' as m; import 'dart:typed_data'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mnemo_cards/features/packs/images_holder.dart'; import 'package:mnemo_cards/theme/themes.dart'; import '../../../di/locator.dart'; class TestImageWidget extends StatefulWidget { final TestImage _testImage; const TestImageWidget(this._testImage, {super.key}); @override State createState() => _TestImageWidgetState(); } class _TestImageWidgetState extends State { TestImage get _testImage => widget._testImage; bool same = false; Widget? cached; @override void didUpdateWidget(TestImageWidget oldWidget) { super.didUpdateWidget(oldWidget); same = oldWidget._testImage == _testImage; } Future _preloadImage() async { try { // final cache = _TestImageCache(); // final cachedImage = cache.image(_testImage); // if (cachedImage != null) { // return cachedImage; // } final imageProvider = await _testImage.loadImage(); if (imageProvider == null) { return SizedBox.shrink(); } // cache.setImage(_testImage, imageProvider); return Image(image: imageProvider); } catch (e) { log('Cant load image ${_testImage}packId: $e'); } return SizedBox(); } @override Widget build(BuildContext context) { // final cache = _TestImageCache(); if (same && cached != null) { return cached!; } return FutureBuilder( future: _preloadImage(), // initialData: cache.image(_testImage), builder: (_, s) { if (s.data == null) { return Container( alignment: Alignment.center, ); } cached = Container( clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, borderRadius: BorderRadius.circular(12), ), child: s.data, ); return cached!; }, ); } } class TestImage { final String data; final String key; TestImage({ required this.data, required this.key, }); @override bool operator ==(Object other) { return other is TestImage && key == other.key; } Future loadImage() async { if (data.length > 50) { Uint8List? bytes; try { bytes = await compute(base64Decode, data); return MemoryImage(bytes!); } catch (e) { log('Cant decode base64 test image'); return null; } } else if (data.contains(':')) { final packId = data.split(':').first; final path = data.split(':').last; return await locator.testManager.loadImage(packId, path); } else { return data.memoryImage; } } TestImage.image(String image) : data = image, key = image.substring(0, m.min(image.length, 50)); }