#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.