Dart 颤振:可观察。当通过导航加载页面时,CombineRelatest2不流式处理

Dart 颤振:可观察。当通过导航加载页面时,CombineRelatest2不流式处理,dart,flutter,rxdart,Dart,Flutter,Rxdart,我正在创建一个带有blocs的Flitter应用程序 我遵循了中提供的代码 它按预期工作, 如果我的应用没有定义路由 class App extends StatelessWidget { Widget build(BuildContext context) { return Provider( child: MaterialApp( title: 'Log Me In!', home: Scaffold( body:

我正在创建一个带有blocs的Flitter应用程序

我遵循了中提供的代码

它按预期工作, 如果我的应用没有定义路由

class App extends StatelessWidget {
  Widget build(BuildContext context) {
    return Provider(
      child: MaterialApp(
        title: 'Log Me In!',
        home: Scaffold(
          body: LoginScreen(),
        ),
      ),
    ); 
  }
}
但当我将应用程序更改为使用路由时

class App extends StatelessWidget {
  Widget build(BuildContext context) {
    return  MaterialApp(
        title: 'Log Me In!',
        routes: {
          '/':(context) => Provider(
            child: Scaffold(
              body: LoginScreen(),
            ),
          )
        },
       );
  }
}
集团代码

class Bloc extends Object with Validators {
  final _email = BehaviorSubject<String>();
  final _password = BehaviorSubject<String>();

  // retrieve data from stream
  Stream<String> get email    => _email.stream.transform(validateEmail);
  Stream<String> get password => _password.stream.transform(validatePassword);
  Stream<bool>   get submitValid => Observable.combineLatest2(email, password, (e, p) => true);

  // add data to stream
  Function(String) get changeEmail    => _email.sink.add;
  Function(String) get changePassword => _password.sink.add;

  submit() {
    final validEmail    = _email.value;
    final validPassword = _password.value;

    print('$validEmail and $validPassword');
  }

  dispose() {
    _email.close();
    _password.close();
  }
}
class Bloc使用验证器扩展对象{
最终电子邮件=行为主体();
最终密码=行为主体();
//从流中检索数据
Stream get email=>\u email.Stream.transform(validateEmail);
Stream get password=>\u password.Stream.transform(validatePassword);
Stream get submitValid=>Observable.CombineRelatest2(电子邮件、密码,(e、p)=>true);
//向流中添加数据
函数(字符串)get changemail=>\u email.sink.add;
函数(字符串)get changePassword=>\u password.sink.add;
提交(){
最终有效邮件=_email.value;
最终有效密码=_password.value;
打印(“$validEmail和$validPassword”);
}
处置{
_email.close();
_password.close();
}
}
Observable.combileLatest2没有流式传输数据(但它流式传输错误)

使用Rxdart版本0.19.0和

颤振1.0.0•通道β• 框架•修订版5391447fae(6天前)•2018-11-29 19:41:26-0800 发动机•版本7375A0F414工具•Dart 2.1.0(版本2.1.0-dev.9.4 f9ebf21297)

我做错什么了吗?
提前感谢

经过多次尝试,我发现当我使用routes进行导航时,Flatter会多次构建页面,这是预期的行为

因此,当它多次构建页面时,它在bloc上创建了多个可观察对象,因为它在每次创建页面路由时都创建了bloc的新实例

所以当我修改代码时

class App extends StatelessWidget {
  final login = Provider(
            child: Scaffold(
              body: LoginScreen(),
            ),
          );
  Widget build(BuildContext context) {
    return  MaterialApp(
        title: 'Log Me In!',
        routes: {
          '/':(context) => login,
        },
       );
  }
}
它工作得很好

另一种方法是创建一个有状态的小部件,并在init方法中进行初始化