Как вызвать провайдера 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();