ReactiveX 和飞镖

ReactiveX and Dart

我有一个classToo

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:

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

我的问题是当用户调用 Too class 的 login() 方法时,在 Foo class.[=19= 级别没有任何反应]

我想做的是,如果用户调用了Tooclass的login()方法并且他的isLogged属性设置为true,那么这个改变是在具有 Too 类型属性的所有 class 的级别。

注意:使用 Angular 或使用 RxJS 的 Ionic 更容易,但使用 dart,我不知道如何实现此机制。

Foo 没有反应,因为它正在侦听 Too.

的不同实例

您的方式是 Foo 的每个新实例都会创建 Too 的新 instance。如果我理解正确的话,您希望 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,因为它简化了很多基于流的东西。