【问题标题】:search with Text to speech works only either with speech or textField使用文本到语音进行搜索仅适用于语音或文本字段
【发布时间】:2019-06-25 10:32:46
【问题描述】:

所以我有一个普通的 TextField 用于过滤列表 children: products.map((doc) => _buildSingleProduct(doc)).toList(),,它可以正常工作,然后我添加了一个文本转语音插件speech_recognition:,并将它与过滤功能结合起来,它工作得很好。 问题是当我完成语音过滤时,例如我想通过写入不再过滤的 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. 我激活语音转文本,它会更改查询并使用新查询过滤列表。

【问题讨论】:

    标签: filter flutter dart speech-to-text


    【解决方案1】:

    所以对于需要解决方案的人来说

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

    您从语音中获得结果,将其添加到处理变量中,但您也可以将该结果添加到控制器中,以便在 textField 中获得结果。

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2023-03-03
      • 2015-06-16
      • 2014-07-02
      • 1970-01-01
      相关资源
      最近更新 更多