RxDart CombineTest不发出数据

RxDart CombineTest不发出数据,dart,rxdart,Dart,Rxdart,我正在用flatter/DART和RXDART做一个小项目 以下是代码的一部分: class RegisterBloc和UserValidator{ 最终_username=BehaviorSubject(); 最终电子邮件=行为主体(); 最终密码=行为主体(); 函数(字符串)get setUsername=>\u username.sink.add; Stream-get-username=>\u-username.Stream.transform(usernameValidatorTra

我正在用
flatter/DART
RXDART
做一个小项目

以下是代码的一部分:
class RegisterBloc和UserValidator{
最终_username=BehaviorSubject();
最终电子邮件=行为主体();
最终密码=行为主体();
函数(字符串)get setUsername=>\u username.sink.add;
Stream-get-username=>\u-username.Stream.transform(usernameValidatorTransformer);
函数(字符串)get setEmail=>\u email.sink.add;
Stream get email=>\u email.Stream.transform(emailValidatorTransformer);
函数(字符串)get setPassword=>\u password.sink.add;
Stream get password=>\u password.Stream.transform(passwordValidatorTransformer);
Stream get validForm=>CombineRelatestStream.combine3(_username.Stream、_email.Stream、_password.Stream,(u,e,p)=>true);
提交()异步{
最终形式=注册执行(
用户名:_username.value,
电子邮件:_email.value,
密码:_password.value
);
}
处置{
_username.close();
_email.close();
_password.close();
}

}
Stream-get-email=>\u-email.Stream.transform(emailValidatorTransformer)
将导致
email==email
为false-始终为false,因为您通过一个转换器来传输它。它可能导致颤振变化检测出现问题。我看到上面的代码像野火一样蔓延,这不是最好的主意。@DarkNeuron我对“Observable.CombineTest”有一个问题,它给了我错误的值,我想知道是不是这个转换器导致了这个问题,你能解释一下为什么“通过一个转换器进行管道传输”是个坏主意吗。我说的是OP的
transform()
。广义而言:
函数的输出通常会产生一个新对象
,因此在OP的情况下,如果您进行比较
变换(someValue)==变换(someValue)
将始终导致
错误
。在决定绘制新的帧之前,颤振的变化检测器检查对象之间是否相等。所以使用总是返回新对象的getter可能是不好的,因为它破坏了相等性。我倾向于避免这种情况。@DarkNeuron,如果在比较时是这样的话,你觉得比较
变换
的输出值而不是比较对象怎么样?你的
变换
是否输出对象?如果是这样的话,可能会有麻烦。如果您有一个使用getter的StreamBuilder,那么我所说的有问题的用例如下:
StreamBuilder(stream:myObject.myGetter)
。如果
myGetter
返回您的流(通过
transform
),则每次都将是一个新流,当相等性检查失败时,flatter将倾向于重建。因此,解决方案是使用initState(或类似的东西),并将
myGetter
的输出存储在对象中。这将导致流对象保持不变,并且相等性检查不会导致问题。希望这是清楚的。