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

ReactiveX 和 Dart

如何解决ReactiveX 和 Dart

我有一堂课Too

class Too{
 bool isLogged = false;
 BehaviorSubject suject = BehaviorSubject<bool>();

 Too({required this.isLogged}){
   suject = new BehaviorSubject<bool>.seeded(isLogged);
 }

void login(){
  isLogged = true;
  suject.sink.add(isLogged);
}

void logout(){
  isLogged = false;
  suject.sink.add(isLogged);
}
void dispose(){
  suject.close();
}

而且我也有 Foo 类:

class Foo{
  Too _too = new Too(isLogged: false);
  
 _too.stream.listen((event) { print('${event}');});
}

我的问题是当用户调用 login() 类的 Too 方法时,Foo 类级别没有任何反应。

我想要做的是,如果用户调用了Too类的login()方法,并且他的isLogged属性设置为true,那么这个改变是在所有类的层面上完成的具有 Too 类型的属性

注意:使用 RxJS 使用 Angular 或 Ionic 来实现要容易得多,但是使用 dart,我不知道如何实现这种机制。

解决方法

Foo 没有反应,因为它正在侦听不同的 Too 实例。

您拥有它的方式是 Foo 的每个新实例都会创建一个新的 instance Too。如果我理解正确,您希望 Foo 的所有实例对 Too 的单个实例的任何更改做出反应。

您可以为此使用单例。

class Too {
  // one of a few ways to make a singleton in Dart
  Too._();
  static final _instance = Too._();
  factory Too() {
    return _instance;
  }

  final subject = BehaviorSubject<bool>.seeded(isLogged);

  static bool isLogged = false;

  void login() {
    isLogged = true;
    subject.sink.add(isLogged);
  }

  void logOut() {
    isLogged = false;
    subject.sink.add(isLogged);
  }

  void dispose() {
    subject.close();
  }
}

现在您可以让任何 Foo 对象侦听同一个 Too 实例。

class Foo {
  Foo() {
    Too().subject.stream.listen((event) {
      print('foo $event'); // this will now print whenever a subject from your Too class is updated. 
    });
  }
}

现在,例如,您可以通过创建一个将其作为 onPressed 的按钮来测试这一点。

onPressed: () {
 final foo = Foo(); // just created an example of a Foo object that will 
 // print the updated value of the Too singleton
 Too().login();
},

RxDart 很棒。但是,当谈到 Flutter 中的响应式编程时,我建议查看 Get X,因为它简化了许多基于流的东西。

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