Riverpod 的基于引用的系统在特定情况下似乎像全局一样工作。我究竟做错了什么?

Riverpod's reference-based system seems to work like a global in a specific case. What am I doing wrong?

在这种情况下,我应该使用传统的(之前的 riverpod)基于小部件的提供程序,还是 riverpod 是否有针对以下情况的解决方案?

我有一个带有项目列表视图的 'page' 小部件。我在两个选项卡中实例化此页面 class/Widget,一个用于实时项目,另一个作为 trash/bin。

目前,我正在通过每个实例化的构造函数以及许多自定义子小部件的构造函数传递一个 '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 &etc........

   }

}

...MyPage 小部件的每个实例都有自己唯一的提供程序。

由于 riverpod 使用全局变量作为提供者,我无法在两个页面实例中设置唯一的提供者以供某些子小部件读取,因为它们将共享提供的变量并覆盖彼此的数据。

(我意识到我有点冗长:我试图让其他初学者清楚地了解 riverpod 在这个线程中的绊脚石。)

雷米 answered me on 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.
   }
}