Как мне поставить камеру на паузу при переходе на новый экран? - PullRequest
0 голосов
/ 21 июня 2020

Я создаю сканер штрих-кода для приложения Flutter. Большая часть работы была проделана замечательными парнями из FlutterFire, и я использую их пример на их github, найденный здесь здесь .

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

Edit

Проблема заключается в приостановке функций _camera.startImageStream и ScannerUtils.detect(.

Я пробовал вызвать функцию _initializeCamera после ожидания Navigator.pu sh, но кажется, что функция инициализации не выполняется до того, как представление будет готово.

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Я решил проблему, вызвав эту функцию перед переходом к новому экрану:

void closeCameraAndStream() async {
  if (_camera.value.isStreamingImages) {
    await _camera.stopImageStream();
}
await _camera.dispose();

setState(() {
  _camera = null;
  _scanResults = null;
});
}

Кроме того, я повторно инициализирую камеру при возвращении к экрану, используя это:

Navigator.of(context)
            .push(MaterialPageRoute(builder: (BuildContext routeContextcontext) => BarcodeResultScreen(barcodeValue)))
            .then((value) {
          _initializeCamera();
        });
0 голосов
/ 21 июня 2020

Насколько я понимаю, они избавляются от всего за вас, поэтому, если вы больше не будете использовать их виджет, все будет правильно удалено.

Вот код, о котором я говорю:

@override
  void dispose() {
    _camera.dispose().then((_) {
      _barcodeDetector.close();
      _faceDetector.close();
      _imageLabeler.close();
      _cloudImageLabeler.close();
      _recognizer.close();
      _cloudRecognizer.close();
    });

    _currentDetector = null;
    super.dispose();
  }

Действительно, когда объект удаляется из дерева виджетов, он вызывает его метод dispose . Поэтому программисты используют это, чтобы закрыть вещи, которые больше не нужны (например, камеру в вашем случае).

Пожалуйста, отметьте https://api.flutter.dev/flutter/widgets/State/dispose.html, чтобы узнать больше об утилизации.

Предупреждение с Navigator.pu sh

Если вы используете Navigator.pu sh, флаттер не уничтожает виджет. Вы должны использовать метод deactivate, чтобы что-то делать, когда вызывается Navigator.pu sh. Там вы можете либо вызвать метод dispose своего виджета, либо скрыть его от своего дерева, установив для переменной _isVIsible значение false. В противном случае просто используйте Navigator.pushReplacement, который удалит виджет должным образом.

...