问题描述
我有一堂课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,因为它简化了许多基于流的东西。