analyseIsSensitiveContentFromImageProvider method

  1. @override
Future<AiClassificationResponse?> analyseIsSensitiveContentFromImageProvider({
  1. required ImageProvider<Object> imageProvider,
  2. String text = '',
})
override

Accepts an ImageProvider, resolves it into an image, converts it to bytes, and passes it to analyseIsSensitiveContent.

This is the most convenient method when using AssetImage, NetworkImage, or any ImageProvider in a Flutter UI context.

Implementation

@override
Future<AiClassificationResponse?> analyseIsSensitiveContentFromImageProvider({
  required ImageProvider imageProvider,
  String text = '',
}) async {
  try {
    // Load and decode the image from the provider
    final ImageStream stream = imageProvider.resolve(
      ImageConfiguration.empty,
    );
    final Completer<ui.Image> completer = Completer<ui.Image>();

    late ImageStreamListener listener;
    listener = ImageStreamListener(
      (ImageInfo info, bool synchronousCall) {
        completer.complete(info.image);
        stream.removeListener(listener);
      },
      onError: (dynamic error, StackTrace? stackTrace) {
        completer.completeError(error, stackTrace);
        stream.removeListener(listener);
      },
    );

    stream.addListener(listener);

    final ui.Image uiImage = await completer.future;

    // Convert ui.Image to Uint8List
    final ByteData? byteData = await uiImage.toByteData(
      format: ui.ImageByteFormat.png,
    );
    if (byteData == null) return null;

    final Uint8List imageBytes = byteData.buffer.asUint8List();

    // Call the existing analysis function
    return await analyseIsSensitiveContent(
      receiptImageBytes: imageBytes,
      text: text,
    );
  } catch (e) {
    _logger.e('Error while converting to bytes: $e');
    return null;
  }
}