Итак, у меня есть обычный TextField, с помощью которого я фильтрую список
children: products.map((doc) => _buildSingleProduct(doc)).toList(),
, все работает как надо, затем я добавил к нему плагин преобразования текста в речь speech_recognition:
и объединил его с функцией фильтрации. Все работает нормально.
Проблема в том, что когда я заканчиваю фильтрацию речи, я, например, хочу добавить или внести исправления в него, записав его в TextField, который больше не фильтруется.
TextField
child: TextField(
controller: controller,
decoration: InputDecoration(
labelText: allTranslations.text(StringConstant.search),
prefixIcon: Icon(Icons.search),
suffixIcon: IconButton(
icon: Icon(Icons.mic),
onPressed: () {
if (_isAvailable && !_isListening)
_speechRecognition
.listen(locale: "en_US")
.then((result) => print('$result'));
},
),
),
),
Как вы можете видеть, есть controller
, который я использую для фильтрации, а затем значок микрофона для передачи результата из речи на контроллер следующим образом:
_speechRecognition
.setRecognitionResultHandler((String result) => setState(() {
controller = TextEditingController(text: resultText = result);
}));
здесь я получаю результат из речи и добавляю его в resultText фильтра и контроллера, чтобы он отображался в textField.
если я сделаю это так:
_speechRecognition
.setRecognitionResultHandler((String speech) => setState(() => resultText = speech));
все работает нормально, но текст явно не появляется в текстовом поле.
для фильтрации textField Я инициирую состояние, чтобы добавить его в resultText:
initState() {
initSpeechRecognizer();
controller.addListener(() {
setState(() {
resultText = controller.text;
});
});
super.initState();
}
вот как я возвращаю результат из БД:
return resultText == null || resultText == ""
? buildProducts(id, title, favorite, message, price, doc)
: doc.data['title'].toLowerCase().contains(resultText.toLowerCase())
? buildProducts(id, title, favorite, message, price, doc)
: Container();
как вы, наверное, видите, я ищу в названии.
Так что проблема еще раз,
1. поиск с речью
появляется в textField и фильтрует список
когда я нажимаю textField, чтобы изменить запрос, он больше не фильтруется.
Но наоборот работает
отфильтровать список с текстом
фильтрует список
Я активирую преобразование речи в текст, и он изменяет запрос и фильтрует список с новым запросом.