поиск с текстом в речь работает только с речью или textField - PullRequest
0 голосов
/ 25 июня 2019

Итак, у меня есть обычный 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. поиск с речью

  1. появляется в textField и фильтрует список

  2. когда я нажимаю textField, чтобы изменить запрос, он больше не фильтруется.

Но наоборот работает

  1. отфильтровать список с текстом

    1. фильтрует список

    2. Я активирую преобразование речи в текст, и он изменяет запрос и фильтрует список с новым запросом.

1 Ответ

0 голосов
/ 25 июня 2019

Так что для людей, которым нужно решение

 _speechRecognition
        .setRecognitionResultHandler((String result) => setState(() {
              resultText = result;
              controller.text = resultText;
            }));

, вы получите результат из речи, добавьте его в переменную обработки, но вы также добавите этот результат в контроллер, чтобы получить результат вtextField.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...