Как вызвать провайдера RiverPod вне дерева виджетов/класса виджетов?

Я новичок в использовании RiverPod. ранее я использовал Provider для управления состоянием.

в случае провайдера я мог бы использовать провайдер вне дерева виджетов, чтобы получить значение, используя синтаксис

      Provider.of<MyModel>(context,listen:true).someFunction();

как мне сделать то же самое в RiverPod? пока я использую Consumer Builder и Consumer Widget. Мне было интересно, есть ли способ вызвать провайдера RiverPod без использования Consumer.

2 ответа

Вы можете легко позвонитьriverpordпровайдер без использованияConsumer. Пожалуйста, ознакомьтесь с моим приведенным ниже расширением, которое очень полезно для вызова провайдера на основе контекста, где он будет работать для функции чтения без каких-либо потребительских или потребительских виджетов.

      extension Context on BuildContext {
  // Custom call a provider for reading method only
  // It will be helpful for us for calling the read function
  // without Consumer,ConsumerWidget or ConsumerStatefulWidget
  // Incase if you face any issue using this then please wrap your widget
  // with consumer and then call your provider

  T read<T>(ProviderBase<T> provider) {
     return ProviderScope.containerOf(this, listen: false).read(provider);
  }
}

После этого в методе сборки вы должны вызвать context.read(yourProviderName)

допустим, у вас есть отдельный класс, который отвечает за логику пользовательского интерфейса:

      class UiController {
  UiController(this._ref);

  final Ref _ref;

  Reader get _reader => _ref.read;

  static final pr = Provider<UiController>((ref) => UiController(ref));

  void someFunction() {
    _reader(otherProvider).getValue();
  }
}

из виджета или других функций, где осуществляется доступ к ref, вы можете вызвать:

      ref.read(UiController.pr).someFunction();
Другие вопросы по тегам