想要根据用户输入启用/禁用按钮。如果所有文本输入都匹配某个条件,则只有启用“插入”按钮。
通常,如果所有输入字段都正确,按钮才会启用。但是,如果一个或多个不正确,并且用户移动到另一个输入字段,并将其更改为正确/不正确,则即使某些字段输入错误,按钮也会启用。检查图像:
登录块代码:
import 'package:rxdart/rxdart.dart';
class LoginScreenBloc {
final _firstCtrl = BehaviorSubject<String>();
final _lastCtrl = BehaviorSubject<String>();
final _userNameCtrl = BehaviorSubject<String>();
final _passwordCtrl = BehaviorSubject<String>();
Function(String) get changeFirst => _firstCtrl.sink.add;
Function(String) get changeLast => _lastCtrl.sink.add;
Function(String) get changeUser => _userNameCtrl.sink.add;
Function(String) get changePass => _passwordCtrl.sink.add;
final fieldSize = StreamTransformer<String, String>.fromHandlers(
handleData: (value, sink) {
if (value.length > 3) {
sink.add(value);
} else {
sink.addError("Can't be Empty!");
}
},
);
Stream<String> get firstname => _firstCtrl.stream.transform(fieldSize);
Stream<String> get lastname => _lastCtrl.stream.transform(fieldSize);
Stream<String> get username => _userNameCtrl.stream.transform(fieldSize);
Stream<String> get password => _passwordCtrl.stream.transform(fieldSize);
void insertValue() {
print("${_firstCtrl.value}");
print("${_lastCtrl.value}");
print("${_userNameCtrl.value}");
print("${_passwordCtrl.value}");
}
Stream<bool> get insertButton {
return CombineLatestStream(
[firstname, lastname, username, password],
(values) {
return true;
},
);
}
dispose() {
_firstCtrl.close();
_lastCtrl.close();
_userNameCtrl.close();
_passwordCtrl.close();
}
}
按钮代码:
Widget insertValue(BuildContext context, LoginScreenBloc bloc) {
return StreamBuilder<Object>(
stream: bloc.insertButton,
builder: (context, snapshot) {
return RaisedButton(
child: Text("Insert"),
onPressed: snapshot.hasData ? bloc.insertValue : null,
);
},
);
}