我在从 BehaviorSubject 获取值时遇到问题。我创建了一个 有两个 TextField 和一个 Button 的 flutter 屏幕,我收到了 他们的数据具有 block 模式。
但是当我更改 TextFields 值时,BehaviorSubject 的值 连接到 TextFiled 得到 null,当我更改 TextField 值时, 连接到 TextFields 的两个 TextFiled 的值变为空。
使用 flutter 和 dart:
import 'dart:async';
import 'package:bloc_provider/bloc_provider.dart';
import 'package:rxdart/rxdart.dart';
import 'package:sense_app_flutter/models/user.dart';
import 'package:sense_app_flutter/resources/user/provider.dart';
enum LoginStatus { SUCCESS, LOADING, ERROR }
class LoginState {
final LoginStatus status;
final String message;
LoginState({this.status, this.message});
}
class LoginBloc implements Bloc {
final UserRepository _userRepository = UserRepository();
final PublishSubject<LoginState> _loginStateSubject = new PublishSubject();
final _user = PublishSubject<User>();
final _usernameController = BehaviorSubject<String>();
final _passwordController = BehaviorSubject<String>();
Observable<LoginState> get loginStateStream => _loginStateSubject.stream;
Function(String) get usernameChange => _usernameController.sink.add;
Function(String) get passwordChange => _passwordController.sink.add;
void changeLoginStatus({LoginState state}) =>
_loginStateSubject.sink.add(state);
Stream<String> get username =>
_usernameController.stream.transform(_updateEmail);
Stream<String> get password =>
_passwordController.stream.transform(_updatePassword);
Stream<bool> get submitCheck =>
Observable.combineLatest2(username, password, (e, p) => true);
void loginSubmit() async {
String valUsername = _usernameController.value;
print(valUsername);
changeLoginStatus(
state: LoginState(status: LoginStatus.LOADING, message: "loading"));
// print("asdas ${username.last.toString()}");
try {
User user = await _userRepository.login("stevanus1997", "asdasd123");
print(user);
_user.sink.add(user);
changeLoginStatus(
state: LoginState(status: LoginStatus.SUCCESS, message: "success"));
} catch (err) {
print(err);
changeLoginStatus(
state:
LoginState(status: LoginStatus.ERROR, message: err.toString()));
}
}
@override
void dispose() {
_usernameController.close();
_passwordController.close();
_loginStateSubject.close();
_user.close();
}
var _updateEmail =
StreamTransformer<String, String>.fromHandlers(handleData: (email, sink) {
if (email == "" || email.trim() == "") {
sink.addError("Email can not be empty");
} else {
sink.add(email);
}
});
var _updatePassword = StreamTransformer<String, String>.fromHandlers(
handleData: (password, sink) {
if (password == "" || password.trim() == "") {
sink.addError("Password can not be empty");
} else {
sink.add(password);
}
});
}
我期望从输入中输出,但总是返回 null。
最佳答案
尝试这样的事情
final _usernameController = BehaviorSubject<String>.seeded("");
代替
final _usernameController = BehaviorSubject<String>();
您可以在种子函数中提供默认值
关于flutter - 为什么 BehaviorSubject 总是返回空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57229995/