Я получаю «NoSuchMethodError» при предварительном просмотре с камеры, это потому, что я не загружаю файл dart на физическое устройство?

#flutter #unity3d #dart #camera #microphone

#flutter #unity3d #dart #камера #микрофон

Вопрос:

Когда я запускаю сеанс отладки через Visual studio code на своем виртуальном Google pixel, я получаю «nosuchmethoderror: недопустимый элемент для null: value», после открытия консоли отладки в vs code говорится, что речь идет о предварительном просмотре камеры. Это вызвано тем, что я запустил это на виртуальной машине? Или как еще я мог бы это исправить? Вот код для файла:

 import 'dart:async';
import 'package:demo_2/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:camera/camera.dart';
import 'package:speech_recognition/speech_recognition.dart';

// Virtual Therapist hosted through unity?
// Hard animate VT for demo and then post through unity --> then Unity to Flutter

// Camera need data ouput

// Microphone need data output

class VirtualTherapist extends StatefulWidget {
  @override
  _VirtualTherapistState createState() => _VirtualTherapistState();
}

class _VirtualTherapistState extends State<VirtualTherapist> {
  SpeechRecognition _speechRecognition;
  bool _isListening = false;
  // ignore: unused_field
  bool _isAvailable = false;
  CameraController _controller;
  Future<void> _initCamFuture;

  String resultText = "";

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

  _initApp() async {
    final cameras = await availableCameras();
    //slect another camera here
    final frontCam = cameras[1];
    _controller = CameraController(
      frontCam,
      ResolutionPreset.medium,
    );
    _initCamFuture = _controller.initialize();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void initSpeechRecognizer() {
    _speechRecognition = SpeechRecognition();
    _speechRecognition.setAvailabilityHandler(
      (bool result) => setState(() => _isAvailable = result),
    );
    _speechRecognition.setRecognitionStartedHandler(
      () => setState(() => _isListening = true),
    );

    _speechRecognition.setRecognitionResultHandler(
      (String speech) => setState(() => resultText = speech),
    );

    _speechRecognition.setRecognitionStartedHandler(
      () => setState(() => _isListening = false),
    );

    _speechRecognition.activate().then(
          (result) => setState(() => _isAvailable = result),
        );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Therapist"),
        ),
        body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              FutureBuilder<void>(
                future: _initCamFuture,
                builder: (context, snapshot) {
                  return CameraPreview(_controller);
                },
                //could change to future builder
                // if (_isAvailable amp;amp; !_isListening)
                // _speechRecognition
                // .listen(locale: "en_US")
                // .then((result) => print('$result'))
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    FloatingActionButton.extended(
                      backgroundColor: Colors.blue,
                      hoverColor: Colors.green,
                      label: const Text(
                        "Here's what we think could help you.",
                        style: TextStyle(
                            color: Colors.white,
                            fontFamily: 'Netflix',
                            fontSize: 15),
                      ),
                      onPressed: () async {
                        if (_isListening)
                          _speechRecognition.stop().then(
                                (result) =>
                                    setState(() => _isListening = result),
                              );
                        Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => ThirdScreen()));
                      },
                    )
                  ])
            ]));
  }
// Unity
}


 

Я не думал, что нужно публиковать мой файл main.dart. Этот код предназначен для второй страницы приложения. Он загружает интерактивный объект Unity, который использует камеру и микрофон пользователя для взаимодействия. Должен ли я просто создать отдельный контейнер для этих проблем?

Ответ №1:

проблема связана с вашим объектом _controller. Является ли оно нулевым при вызове CameraPreview(_controller); , чтобы решить эту проблему, вам нужно удалить функцию _initApp() from initState и предоставить ее в качестве будущего вашего будущего разработчика как

 future: _initApp(),
builder: (context, snapshot) {
    if(snapshot.connectionState == ConnectionState.done){
       return CameraPreview(_controller);
    }
   //else show loading
},
 

и возвращаюсь _controller.initialize(); из вашего _initApp метода.