我正在使用 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/