#flutter #dart #global #provider #riverpod
Вопрос:
Является ли это тем случаем, когда я должен использовать традиционного (до riverpod) поставщика виджетов на основе или у riverpod есть решение для следующего сценария?
У меня есть виджет «страница» со списком элементов. Я создаю экземпляр этого класса/виджета страницы на двух вкладках, одна из которых предназначена для живых элементов, а другая-для корзины / корзины.
В настоящее время я передаю логическое значение «is_trash» через конструктор каждого экземпляра, а также конструкторы многих пользовательских суб-виджетов, чтобы они могли знать, как все скрыть и т. Д.
Поставщик-это очевидный способ избежать возни с конструкторами только для одного логического значения.
Таким образом, традиционный способ заключается в :
class MyPage extends StatelessWidget{
bool isTrashView;
MyPage(this.isTrashView);
Widget build(context){
return Provider<bool>.value(
value : isTrashView,
child : MyCustomList(/*don't need an isTrashView parameter here*/),
);
}
}
class MyCustomList extends StatelessWidget{
Widget build(context){
bool isTrashView=Provider<bool>.of(context).value;
return amp;etc........
}
}
…и каждый экземпляр виджета MyPage получает своего собственного уникального поставщика.
Поскольку riverpod использует глобальные значения для поставщиков, я не могу настроить уникальных поставщиков в двух экземплярах страниц для чтения каким-либо суб-виджетом, поскольку они будут совместно использовать предоставленную переменную и перезаписывать данные друг друга.
(Я понимаю, что был немного многословен: я пытаюсь прояснить для других новичков, чтобы они могли наткнуться на эту тему.)
Комментарии:
1. Я не совсем уверен, что полностью понимаю вопрос, но вы смотрели на модификатор семьи? riverpod.dev/документы/концепции/модификаторы/семейство
2. Спасибо, что попытались помочь. Я отредактировал текст, чтобы попытаться внести ясность. Я не вижу, как помогает модификатор семьи.
3. Мне трудно ответить на этот вопрос, потому что я бы просто передал isTrashView в качестве параметра дочернему виджету.
4. Я бы также просто сделал параметр, но в базе кода есть много пользовательских виджетов, глубоко вложенных, так что это много параметров конструктора и только для нескольких настроек пользовательского интерфейса. Я искал лучшее/элегантное решение. Реми ответила мне на Reddit, и то, что мне было нужно, — это ProviderScope с приложением ScopeProvider для данных.
5. Пожалуйста, добавьте ответ в качестве ответа, а не в свой вопрос.
Ответ №1:
Реми ответила мне на Reddit. Решение состояло в том, чтобы использовать ScopedProvider для данных и ProviderScope в пользовательском виджете:
final isTrashView = ScopedProvider<bool>((_) => false);
class MyCustomWidget extends StatelessWidget {
const MyCustomWidget({this.trashView = false});
final bool trashView;
@override
Widget build(BuildContext context) {
return ProviderScope(
overrides: [
isTrashView.overrideWithValue(trashView),
],
child: AnotherCustomWidget(),
);
}
}
class AnotherCustomWidget extends ConsumerWidget {
const AnotherCustomWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, ScopedReader watch) {
final trashView = watch(isTrashView);
// etc.
}
}
Комментарии:
1. Было бы полезно добавить реализацию для другого пользовательского виджета.