Files
sxchnge/frontend/app/lib/kyc/preview.dart
T

59 lines
1.5 KiB
Dart

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:sxchnge_kyc/sxchnge_kyc.dart';
import '../generated/i18n/app_localizations.dart';
/// Evict this sensitive preview's decoded cache entry on replacement or exit.
class PhotoPreview extends StatefulWidget {
const PhotoPreview({super.key, required this.photo, required this.label});
final Photo photo;
final String label;
@override
State<PhotoPreview> createState() => _PhotoPreviewState();
}
class _PhotoPreviewState extends State<PhotoPreview> {
late ImageProvider _image = _provider();
ImageProvider _provider() => ResizeImage.resizeIfNeeded(
1000,
null,
// Web decoders require a native typed array, not the model's read-only view.
MemoryImage(Uint8List.fromList(widget.photo.bytes)),
);
@override
void didUpdateWidget(covariant PhotoPreview oldWidget) {
super.didUpdateWidget(oldWidget);
if (!identical(oldWidget.photo, widget.photo)) {
_image.evict();
_image = _provider();
}
}
@override
void dispose() {
_image.evict();
super.dispose();
}
@override
Widget build(BuildContext context) => Image(
image: _image,
height: 220,
fit: BoxFit.contain,
semanticLabel: widget.label,
errorBuilder: (_, _, _) => ConstrainedBox(
constraints: const BoxConstraints(minHeight: 220),
child: Center(
child: Semantics(
container: true,
liveRegion: true,
child: Text(AppLocalizations.of(context)!.kycErrorPreview),
),
),
),
);
}