59 lines
1.5 KiB
Dart
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),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|