Хотите открыть сканер штрих-кода/QR-кода в контейнере

Я использую библиотеку сканирования штрих-кодов, которая при вызове открывает сканер во всем окне браузера. Однако я хотел бы изменить это поведение, чтобы сканер открывался в определенном контейнере на веб-странице, а не занимал всю страницу.

По сути, я хочу, чтобы камера телефона пользователя функционировала как сканер продукта в определенной области веб-страницы, подобно тому, как сканирование штрих-кода работает во многих мобильных приложениях для покупок.

Как я могу этого добиться? Существуют ли какие-либо конкретные библиотеки или методы Flutter, которые мне следует использовать для встраивания сканера штрих-кода в контейнер на моей веб-странице? образ .

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
import 'package:simple_barcode_scanner/simple_barcode_scanner.dart';

class Scanner extends StatefulWidget {
  final double width;
  final double height;
  final int borderRadius;
  final int borderWidth;
  final Color borderColor;

  const Scanner({
    super.key,
    required this.width,
    required this.height,
    required this.borderRadius,
    required this.borderWidth,
    required this.borderColor,
  });

  @override
  _ScannerState createState() => _ScannerState();
}

class _ScannerState extends State {
  String _result = '';

  // late String _barcodeResult;

  @override
  void initState() {
    super.initState();
  }

  Future<void> ScanCode() async {
    String barcodeScanResult;
    try {
      barcodeScanResult = await FlutterBarcodeScanner.scanBarcode(
          "#FF6666", "cancelButtonText", true, ScanMode.BARCODE);
    } on PlatformException {
      barcodeScanResult = 'Hello';
    }
    setState(() {
      _result = barcodeScanResult;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Container(
          height: 400,
          width: MediaQuery.of(context).size.width * 0.95,
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(20),
            border: Border.all(color: Colors.black, width: 3),
          ),
          child: ElevatedButton(
            onPressed: () async {
              var res = await Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => const SimpleBarcodeScannerPage(),
                  ));
              setState(() {
                if (res is String) {
                  _result = res;
                }
              });
            },
            child: const Text('Open Scanner'),
          ),
        ),
      ],
    );
  }
}

Пробовал поставить сканер прямо в контейнер(не получилось). Я попробовал использовать простой сканер штрих-кода, сканер штрих-кода AI и сканер штрих-кода Flutter.

Сначала вам следует попробовать официальный плагин камеры Flutter. В вашем коде я не вижу никакого виджета флаттер-камеры. Чтобы гибко управлять предварительным просмотром камеры, собственный вид камеры необходимо привязать к виджету Flutter. Я предполагаю, что ваш код запускает только собственную активность камеры.

yushulx 06.05.2024 03:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте расширенный вместо контейнера. Вот как это можно сделать:

Padding(
    padding: const EdgeInsets.all(8.0),
    child: Column(
      children: [
        Expanded(
          flex: 2, //adjust flex as your requirement
          child: MobileScanner(
            controller: MobileScannerController(
              detectionSpeed: DetectionSpeed.noDuplicates,
            ),
            onDetect: (capture) {
              final List<Barcode> barcodes = capture.barcodes;
              for (final barcode in barcodes) {
                debugPrint('QR found! ${barcode.rawValue}');
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) {
                      return ResultScreen(
                        resultText: barcode.rawValue ?? "",
                      );
                    },
                  ),
                );
              }
              print("QR Code Found!");
            },
          ),
        ),
        Expanded(
          flex: 2, // adjust flex
          child: Column(
            children: [
              //Here you can add you required widgets.
            ],
          ),
        ),
      ],
    ),
  )

Здесь я использовал mobile_scanner но вы можете использовать barcode_scanner, simple_barcode_scanner любой из них. Дайте мне знать, если у вас все еще возникнут трудности.

Приятного кодирования...

Другие вопросы по теме