Функциональность Scandit AR на Flutter ничего не показывает

#android #ios #flutter #augmented-reality #scandit

Вопрос:

Я разрабатываю приложение для составления списка покупок, в котором пользователи могут сканировать несколько штрих-кодов и просматривать некоторые данные, связанные с товарами. Я успешно интегрировал Scandit с MatrixScan и с BarcodeTrackingBasicOverlay его помощью правильно фокусируюсь на штрих-кодах. Затем я хочу перейти к BarcodeTrackingAdvancedOverlay простому представлению с некоторым текстом поверх штрих-кода и показать его, но это не работает. У меня есть лицензия на использование Matrixscan. Мой код инициализации выглядит так

 bool _loading = false;
Camera _camera = Camera.defaultCamera;
BarcodeTracking _barcodeTracking;
DataCaptureView _captureView;
TorchState _torchState = TorchState.off;
bool _isPermissionMessageVisible = false;
BarcodeTrackingAdvancedOverlay overlay;

@override
  void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);

_camera.applySettings(BarcodeCapture.recommendedCameraSettings);

_checkPermission();

var captureSettings = BarcodeTrackingSettings();
captureSettings.enableSymbologies({
  Symbology.ean8,
  Symbology.ean13Upca,
  Symbology.upce,
  Symbology.code39,
  Symbology.code128,
});

_barcodeTracking = BarcodeTracking.forContext(_context, captureSettings)
  ..addListener(this);

_captureView = DataCaptureView.forContext(_context);

/*var _basicOverlay = BarcodeTrackingBasicOverlay.withBarcodeTrackingForView(
  _barcodeTracking,
  _captureView,
)..brush = Brush(Color(0x00FFFFFF), Color(0xFFFFFFFF), 2);*/

overlay = BarcodeTrackingAdvancedOverlay.withBarcodeTrackingForView(
  _barcodeTracking,
  _captureView,
)..listener = this;

//_captureView.addOverlay(_basicOverlay);
_captureView.addOverlay(overlay);

_context.setFrameSource(_camera);
_camera.switchToDesiredState(FrameSourceState.on);
_barcodeTracking.isEnabled = true;
}
 

Основная часть представления представляет собой простое Stack Center изображение, в котором я показываю _captureview и некоторый текст.
Моя реализация кулака была с BarcodeTrackingAdvancedOverlayListener помощью, и она не показывала никаких виджетов поверх штрих-кодов:

   @override
 PointWithUnit offsetForTrackedBarcode(
  BarcodeTrackingAdvancedOverlay overlay, TrackedBarcode trackedBarcode) {
return PointWithUnit(DoubleWithUnit(0, MeasureUnit.fraction),
    DoubleWithUnit(-1, MeasureUnit.fraction));
 }

 @override
 Anchor anchorForTrackedBarcode(
  BarcodeTrackingAdvancedOverlay overlay, TrackedBarcode trackedBarcode) {
  return Anchor.center;
 }

 @override
 Widget widgetForTrackedBarcode(
  BarcodeTrackingAdvancedOverlay overlay, TrackedBarcode trackedBarcode) {
return ARWidget(data: trackedBarcode.barcode.data ?? 'CIAO');
 }
 

Я также попробовал с didUpdateSession реализацией (аналогично образцу приложения Scandit), но также не сработало:

 @override
void didUpdateSession(
  BarcodeTracking barcodeTracking, BarcodeTrackingSession session) {

  for (final lostTrackIdentifier in session.removedTrackedBarcodes) {
  // You now know the identifier of the tracked barcode that has been lost.
  // Usually here you would remove the views associated.
  }

for (final trackedBarcode in session.addedTrackedBarcodes) {
  // Fixed identifier for the tracked barcode.
  var trackingIdentifier = trackedBarcode.identifier;

  // Current location of the tracked barcode.
  var location = trackedBarcode.location;
  _captureView
      .viewQuadrilateralForFrameQuadrilateral(location)
      .then((quadrilateral) => {
    _updateView(trackedBarcode, location)
          });
  }
}

_updateView(TrackedBarcode trackedBarcode, Quadrilateral viewLocation) {
// If the barcode is wider than the desired percent of the data capture view's width, show it to the user.
var shouldBeShown = viewLocation.width() > MediaQuery.of(context).size.width * 0.1;
if (!shouldBeShown) {
  overlay.setWidgetForTrackedBarcode(null, trackedBarcode);
  return;
}

var bubble = ARWidget(data: trackedBarcode.barcode.data ?? '');
overlay.setWidgetForTrackedBarcode(bubble, trackedBarcode);
print('YES');
}
 

@override
void didTapViewForTrackedBarcode(
BarcodeTrackingAdvancedOverlay overlay, TrackedBarcode trackedBarcode) {}

Мое ARWidget это:

 class ARWidget extends StatelessWidget {
final String data;

const ARWidget({Key key, this.data}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
  width: 180,
  height: 60,
  decoration: BoxDecoration(
    color: const Color(0xFFFFFFEE),
    borderRadius: BorderRadius.circular(30),
  ),
  child: Row(
    textDirection: TextDirection.ltr,
    children: [
      Container(
        width: 60,
        height: 60,
        decoration: BoxDecoration(
          color: const Color(0xFF58B5C2),
          borderRadius: BorderRadius.circular(30),
        ),
        child: Icon(
          Icons.widgets,
          color: Colors.white,
        ),
      ),
    ],
  ),
);
}
 

}

Я видел на консоли, что каждый раз, когда он пытается отобразить виджет, возникает эта ошибка:

 [        ] I/flutter ( 1208): 'package:flutter/src/widgets/focus_manager.dart': Failed assertion: line 1463 pos 12: 'RawKeyboard.instance.keyEventHandler == null': is not true.
 

Который с небольшой отладкой обнаружил, что он относится к СТРОКЕ 34 из widget_to_base64_converter.dart .

 final buildOwner = BuildOwner();
 

Я также попробовал пример приложения AR Flutter и получил тот же результат.
У вас есть какие-либо идеи о том, как решить эту проблему, или это вина Скандита?

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

1. Здравствуйте @LorenzOliveto вы нашли какое-либо решение? Я сталкиваюсь с той же проблемой

2. Мы получили поддержку от Scandit, она корректно работает с версией Flutter ниже 2.1.0, потому что Flutter 2.1.0 представил поведение, нарушающее SDK. Они планируют обновить SDK до версии 6.10.0-бета. 2, что решит проблему.

3. Спасибо, брат. Это очень полезно.