Flutter : элемент с именем «read» определен в расширениях «ReadContext» и «BuildContextX», и ни один из них не является более специфичным

#flutter #bloc #riverpod

Вопрос:

У меня в приложении есть кнопка, которая возвращает :

 onPressed: () {
                    return context
                        .read(FavoriteIds.provider.notifier)
                        .toggle(doa.id.toString());
                  },
 

В этом случае я использовал провайдера riverpod. Но когда я хочу импортировать flutter_bloc пакет, read ключевым словом будет ошибка с этим сообщением
A member named 'read' is defined in extensions 'ReadContext' and 'BuildContextX' and neither is more specific. Try using an extension override to specify the extension you want to to be chosen.

Пожалуйста, помогите мне решить эту проблему. спасибо вам 🙂

Ответ №1:

Это означает, что вы импортируете 2 расширения, которые предоставляют один и тот же метод read . Рассмотрим этот пример:

 extension Ext1 on String {
  void foo() => print("from extension 1");
}

extension Ext2 on String {
  void foo() => print("from extension 2");
}

void main() {
  String s = "hello";
  s.foo();
}
 

Что должен печатать этот код? Очевидного ответа нет, и, чтобы избежать случайных ошибок программирования, Dart запрещает это.

Вы можете попробовать «перейти к определению» (щелчок ctrl/cmd в большинстве IDE) для read метода, чтобы перейти к одному из файлов, в котором он определен, а затем удалить соответствующую инструкцию импорта.

Однако, возможно, будет быстрее просто удалить все инструкции импорта в этом файле и добавить их обратно с помощью автозаполнения

Ответ №2:

Здесь проблема read() определяется в обоих ReadContext amp; BuildContextX расширениях. Таким образом, компилятор не знает, какое расширение использовать.

Чтобы устранить ошибку, используйте : ReadContext(context).read если вы хотите получить доступ к блоку или BuildContextX(context).read() в соответствии с вашими потребностями.