Справочная система Riverpod, похоже, работает как глобальная в конкретном случае. Что я делаю не так?

#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. Было бы полезно добавить реализацию для другого пользовательского виджета.