Флаттер: странная ошибка диапазона (индекс находится в пределах ожидаемого диапазона)

#flutter #dart

Вопрос:

Недавно я перенес свое приложение на Flutter 2 с нулевой безопасностью, и я столкнулся со странной ошибкой. У меня есть следующая функция, которую я использую для преобразования изображения CameraImage (YUV) в RGB-изображение, которое безупречно работало до перехода с Flutter 1.26 на 2.3 и миграции. После этого он начал жаловаться на ошибку RangeError (индекс): Индекс вне диапазона, который я не понимаю, и описание ошибки не помогает.

 static imageLib.Image convertYUV420ToImage(CameraImage cameraImage) {

   final int width = cameraImage.width;
   final int height = cameraImage.height;

   final int uvRowStride = cameraImage.planes[1].bytesPerRow;
   final int? uvPixelStride = cameraImage.planes[1].bytesPerPixel;

   final image = imageLib.Image(width, height);
   for (int w = 0; w < width; w  ) {
     for (int h = 0; h < height; h  ) {
       final int uvIndex =
           uvPixelStride! * (w / 2).floor()   uvRowStride * (h / 2).floor();
       final int index = h * width   w;

       print("index $index and $uvIndex");
       final y = cameraImage.planes[0].bytes[index];
       final u = cameraImage.planes[1].bytes[uvIndex];
       final v = cameraImage.planes[2].bytes[uvIndex];

       image.data[index] = ImageUtils.yuv2rgb(y, u, v);
     }
   }
   return image;
 }
 

Выход есть

 ...
I/flutter (19516): index 344169 and 172088
I/flutter (19516): index 344889 and 172088
I/flutter (19516): index 10 and 10
E/flutter (19516): [ERROR:flutter/runtime/dart_isolate.cc(1138)] Unhandled exception:
E/flutter (19516): RangeError (index): Index out of range: index should be less than 345600: 10
E/flutter (19516): #0      _Uint8ArrayView.[] (dart:typed_data-patch/typed_data_patch.dart:4070:7)
E/flutter (19516): #1      ImageUtils.convertYUV420ToImage (package:anh_flutter/recognition/ImageUtils.dart:42:46)
E/flutter (19516): #2      ImageUtils.convertCameraImage (package:anh_flutter/recognition/ImageUtils.dart:13:14)
E/flutter (19516): #3      IsolateUtils.entryPoint (package:anh_flutter/recognition/IsolateUtils.dart:47:30)
 

Что вряд ли имеет какой-либо смысл, поскольку 10 меньше 345600. Я также проверил, что cameraImage.planes[0].байт.длина действительно составляет 345600, как и ожидалось.

Пожалуйста, кто-нибудь может помочь мне понять, что здесь может быть не так?

Комментарии:

1. Эй, постарайтесь не использовать 2.3 — он не стабилен. попробуйте 2.2 или 2.5.

2. пожалуйста, попробуйте: прямой доступ , например cameraImage.planes[0].bytes[10] , вне цикла, например, в качестве кода 1-й строки в вашей функции. затем посмотрите, по-прежнему ли это ошибки

3. По теме: github.com/flutter/flutter/issues/89584 похоже, это проблема дротика.

4. Похоже, это ошибка. Индекс выданной ошибки все еще находится в пределах диапазона: RangeError (index): Index out of range: index should be less than 345600: 10

5. Да, это ошибка, о которой я сообщил 🙂

Ответ №1:

Установите enable_isolate_groups флажок на true

Комментарии:

1. Не могли бы вы предоставить более подробную информацию о том, как этот флаг решает проблему?

Ответ №2:

Это было решено с помощью исправления ошибок в компиляторе dart. В настоящее время он доступен в главном канале Flutter.