#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. Спасибо, брат. Это очень полезно.