dart - Flutter:通过导航加载页面时,Observable.combineLatest2 不进行流式传输

标签 dart flutter rxdart

我正在使用 blocs 创建一个 flutter 应用程序。

我遵循 Flutter login with blocs 中提供的代码

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

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(),
            ),
          )
        },
       );
  }
}

block 代码

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();
  }
}

Observable.combileLatest2 不传输数据(但它传输错误)。

使用 Rxdart 版本 0.19.0 和

Flutter 1.0.0 • channel 测试版 • https://github.com/flutter/flutter.git 框架 • 修订版 5391447fae(6 天前) • 2018-11-29 19:41:26-0800 引擎 • 修订版 7375a0f414工具 • Dart 2.1.0(内部版本 2.1.0-dev.9.4 f9ebf21297)

我在这里做错了什么吗? 提前致谢

最佳答案

经过大量试验,我发现当我使用路线进行导航时,flutter 会多次构建页面,这就是预期的行为,请参阅 here for detailed answer

因此,当它多次构建页面时,它会在 block 上创建多个 Observables,因为每次创建页面路由时都会创建新的 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,
        },
       );
  }
}

效果很好。

另一种实现方式是创建一个有状态的widget并在init方法中进行初始化。

关于dart - Flutter:通过导航加载页面时,Observable.combineLatest2 不进行流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53641332/

相关文章:

flutter - 抖动错误:未为 'combineLatest4'类型定义 'Observable'方法

dart - 如何在pub中保留软件包名称?

dart - 为什么此Web-UI代码不起作用?

flutter - 如何让 flutter run -d chrome 使用 https?

flutter - 下拉以在 flutter 中显示搜索栏?

java - Flutter android 应用程序在签名发布后尝试调试时崩溃

Flutter - 显示来自本地 json 文件的图像 url

Flutter 嵌套行 MainAxisAlignment

flutter - 如何比较 Dart 中的文件/流平等