微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Riverpod 的基于参考的系统似乎在特定情况下像全局一样工作我做错了什么?

在这种情况下,我应该使用传统的(pre-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 &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.
   }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。