#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
метода.