【问题标题】:Flutter: Observable.combineLatest2 is not streaming when page is loaded through navigationFlutter:通过导航加载页面时,Observable.combineLatest2 没有流式传输
【发布时间】:2019-05-07 13:20:01
【问题描述】:

我正在创建一个带有 blocs 的颤振应用程序。

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

块代码

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 • 频道测试版 •https://github.com/flutter/flutter.git 框架 • 修订 5391447fae(6 天前) • 2018-11-29 19:41:26-0800 引擎 • 修订版 7375a0f414Tools • Dart 2.1.0(内部版本 2.1.0-dev.9.4 f9ebf21297)

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

【问题讨论】:

    标签: dart flutter rxdart


    【解决方案1】:

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

    因此,当它多次构建页面时,它会在 bloc 上创建多个 Observable,因为它每次创建 Page 路由时都会创建 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方法中进行初始化。

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 2012-02-11
      • 2018-09-08
      • 1970-01-01
      • 2021-10-04
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多