Пытался прослушать значение, предоставленное поставщиком, за пределами дерева виджетов. Но я хочу послушать это

Я пытаюсь прослушать обновления строковой переменной в моей модели поставщика. Flutter предполагает, что я их не слушаю, поскольку слушатель явно находится вне контекста дерева виджетов, и я не понимаю, почему.

Мой виджет, который я вызываю слушателем, - это IconButton, который находится в классе виджетов с отслеживанием состояния, который является частью элемента списка многих других элементов, который входит в построитель ListView. Я хочу получить строку от слушателя, а затем вызвать setState в классе виджета Stateful, чтобы обновить элемент списка только из элемента списка, у которого был нажат IconButton. Я не хочу обновлять каждый элемент списка в построителе ListView. В противном случае я бы поместил слушателя непосредственно в текстовое поле. Надеюсь, это имеет смысл .. :)

IconButton(
    icon: Icon(Icons.mic),
    onPressed: () {
        Provider.of<VoiceFunctions>(context, listen: false).startFirstVoiceListener();
        var newWords = Provider.of<VoiceFunctions>(context, listen: true).outputString;
        print(newWords);
}),

Я попытался переместить прослушиватель для outputString в его собственную функцию, чтобы он вышел из onPressed (), но это дает ту же ошибку.

Полная трассировка стека:


════════ Exception caught by gesture ═══════════════════════════════════════════
The following assertion was thrown while handling a gesture:
Tried to listen to a value exposed with provider, from outside of the widget tree.

This is likely caused by an event handler (like a button's onPressed) that called
Provider.of without passing `listen: false`.

To fix, write:
Provider.of<VoiceFunctions>(context, listen: false);

It is unsupported because may pointlessly rebuild the widget associated to the
event handler, when the widget tree doesn't care about the value.

The context used was: FlashcardItemWidget(dependencies: [MediaQuery, _LocalizationsScope-[GlobalKey#02e26], _InheritedTheme], state: _FlashcardItemWidgetState#51c99)
'package:provider/src/provider.dart':
Failed assertion: line 191 pos 7: 'context.owner.debugBuilding ||
          listen == false ||
          debugIsInInheritedProviderUpdate'

person Ian Smith    schedule 23.05.2020    source источник


Ответы (1)


Попробуйте:

Provider.of<VoiceFunctions>(context, listen: false);
person Mi Compañera Segura    schedule 22.09.2020