Проблема в использовании провайдера во флаттере при прослушивании: true - PullRequest
0 голосов
/ 07 марта 2020

Я работаю над приложением во флаттере. Я пытаюсь использовать Provider в приложении, но столкнулся с этой ошибкой:

 Tried to listen to a value exposed with provider, from outside of the widget tree.
E/flutter ( 2850): 
E/flutter ( 2850): This is likely caused by an event handler (like a button's onPressed) that called
E/flutter ( 2850): Provider.of without passing `listen: false`.
E/flutter ( 2850): 
E/flutter ( 2850): To fix, write:
E/flutter ( 2850): Provider.of<Complexes>(context, listen: false);
E/flutter ( 2850): 
E/flutter ( 2850): It is unsupported because may pointlessly rebuild the widget associated to the
E/flutter ( 2850): event handler, when the widget tree doesn't care about the value.

мой код:

  loadedComplexes = Provider.of<Complexes>(context, listen: true).favoriteItems;

Когда установлено прослушивание: false, проблема решена. но я думаю, что это не очень хороший способ решить эту проблему. Также мне нужен провайдер, чтобы слушать. У меня есть поиск по inte rnet, но я не смог найти подходящего решения.

Это мой врач Flutter:

      [√] Flutter (Channel stable, v1.12.13+hotfix.7, on Microsoft Windows [Version 10.0.18363.657],    locale en-US)
   • Flutter version 1.12.13+hotfix.7 at C:\android\flutter
   • Framework revision 9f5ff2306b (6 weeks ago), 2020-01-26 22:38:26 -0800
   • Engine revision a67792536c
   • Dart version 2.7.0

[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at C:/android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 28.0.3
    • ANDROID_HOME = C:/android/sdk
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b04)
    • All Android licenses accepted.

[√] Android Studio (version 3.6)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 43.0.2
    • Dart plugin version 192.7761
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b04)

[√] IntelliJ IDEA Ultimate Edition (version 2019.3)
    • IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4
    • Flutter plugin version 42.1.4
    • Dart plugin version 193.5731

[!] VS Code (version 1.41.1)
    • VS Code at C:\Users\Altay\AppData\Local\Programs\Microsoft VS Code
    X Flutter extension not installed; install from
      https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[√] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 5.0.2 (API 21) (emulator)

! Doctor found issues in 1 category.
Process finished with exit code 0

мой блок провайдера:

     return MultiProvider(
  providers: [
    ChangeNotifierProvider(
      create: (ctx) => Salons(),
    ),
    ChangeNotifierProvider(
      create: (ctx) => Cities(),
    ),
    ChangeNotifierProvider(
      create: (ctx) => Auth(),
    ),
    ChangeNotifierProvider(
      create: (ctx) => Complexes(),
    ),
    ChangeNotifierProvider(
      create: (ctx) => UserInfo(),
    ),
    ChangeNotifierProvider(
      create: (ctx) => User(),
    ),
  ],
  child: MaterialApp(........

Метод, который вызывает провайдера:

     Future<void> _submit() async {
loadedComplexes.clear();
loadedComplexes =
    Provider.of<Complexes>(context, listen: true).favoriteItems;
loadedComplexestolist.addAll(loadedComplexes);

}

Я могу предоставить провайдеру дополнительную информацию, если это необходимо.

Есть ли какое-либо решение для этой проблемы?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Если listen должно быть true, у провайдера не будет этого флага.

Ситуация, в которой вы находитесь, требует listen:false по определенной причине. Это правильное решение здесь.

0 голосов
/ 07 марта 2020

Настройка прослушивания false - не плохая практика. Он используется при однократном доступе к значению поставщика или при вызове метода поставщика.

Если вы хотите прослушать обновления, у вас есть выбор между рядом различных провайдеров .

...