如何在 Flutter 2 中获取 snapshot.error?
How to get the snapshot.error in Flutter 2?
我将我的 Flutter 应用程序更新为 Flutter 2,现在当我尝试在我的 StreamBuider 中获取 snapshot.error 时,我得到了这个
这些是带有 Streams 的验证器。
class LoginStreams with Validators {
dispose() {
_emailController.close();
_passwordController.close();
}
Function(String) get emailOnChange => _emailController.sink.add;
Function(String) get passwordOnChange => _passwordController.sink.add;
final _emailController = StreamController<String>.broadcast();
final _passwordController = StreamController<String>.broadcast();
Stream<String> get emailStream =>
_emailController.stream.transform(emailValidator);
Stream<String> get passwordStream =>
_passwordController.stream.transform(passwordValidator);
}
--
class Validators {
final passwordValidator = StreamTransformer<String, String>.fromHandlers(
handleData: (password, sink) {
password.length >= 5
? sink.add(password)
: sink.addError("La contraseña debe contener más de 5 caracteres");
});
final emailValidator =
StreamTransformer<String, String>.fromHandlers(handleData: (email, sink) {
if (email.contains('@') && email.contains('.')) {
sink.add(email);
} else {
sink.addError("Ingrese un email válido");
}
});
}
StreamBuilder(
stream: _validators.emailStream,
builder: (BuildContext context, AsyncSnapshot snapshot)=>TextField(
keyboardType: TextInputType.emailAddress,
controller: emailController,
decoration: InputDecoration(
errorText: '$snapshot.error',
labelText: widget.loginModel.emailTextfield,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(CmbSpacing.SpaceMD))),
onChanged: _validators.emailOnChange,
),
),
SizedBox(height: CmbSpacing.SpaceSM),
StreamBuilder(
stream: _validators.passwordStream,
builder: (BuildContext context, AsyncSnapshot snapshot)=>TextField(
controller: passwordController,
obscureText: true,
decoration: InputDecoration(
errorText: '$snapshot.error',
suffixIcon: Icon(Icons.visibility_off_outlined),
labelText: widget.loginModel.passwordTextfield,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(CmbSpacing.SpaceMD))),
onChanged: _validators.passwordOnChange,
),
),
如果有人能帮助我,我将不胜感激,我很困惑,因为在升级到 Flutter 2 之后,它曾经工作得很好。
Flutter 2 中的 StreamBuilder 有什么新东西吗?
编辑:
我把“$snapshot.error”改成snapshot.error.toString()
现在我得到了 null。
您没有正确插入错误。
如果你想在插值之前调用一个额外的方法,你必须将表达式包装在 ${}
中,例如'${snapshot.error}
。在您的情况下,您只是将 .error
附加到 snapshot
的字符串表示形式
替换
errorText: '$snapshot.error'
有
errorText: snapshot.error?.toString()
// or if you want to use it in a sentence
errorText: "This is the error: ${snapshot.error}"
你必须在那边应用条件语句:
errorText: snapshot.hasError ? '${snapshot.error}' : null
我相信这会有所帮助。 :)
我将我的 Flutter 应用程序更新为 Flutter 2,现在当我尝试在我的 StreamBuider 中获取 snapshot.error 时,我得到了这个
这些是带有 Streams 的验证器。
class LoginStreams with Validators {
dispose() {
_emailController.close();
_passwordController.close();
}
Function(String) get emailOnChange => _emailController.sink.add;
Function(String) get passwordOnChange => _passwordController.sink.add;
final _emailController = StreamController<String>.broadcast();
final _passwordController = StreamController<String>.broadcast();
Stream<String> get emailStream =>
_emailController.stream.transform(emailValidator);
Stream<String> get passwordStream =>
_passwordController.stream.transform(passwordValidator);
}
--
class Validators {
final passwordValidator = StreamTransformer<String, String>.fromHandlers(
handleData: (password, sink) {
password.length >= 5
? sink.add(password)
: sink.addError("La contraseña debe contener más de 5 caracteres");
});
final emailValidator =
StreamTransformer<String, String>.fromHandlers(handleData: (email, sink) {
if (email.contains('@') && email.contains('.')) {
sink.add(email);
} else {
sink.addError("Ingrese un email válido");
}
});
}
StreamBuilder(
stream: _validators.emailStream,
builder: (BuildContext context, AsyncSnapshot snapshot)=>TextField(
keyboardType: TextInputType.emailAddress,
controller: emailController,
decoration: InputDecoration(
errorText: '$snapshot.error',
labelText: widget.loginModel.emailTextfield,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(CmbSpacing.SpaceMD))),
onChanged: _validators.emailOnChange,
),
),
SizedBox(height: CmbSpacing.SpaceSM),
StreamBuilder(
stream: _validators.passwordStream,
builder: (BuildContext context, AsyncSnapshot snapshot)=>TextField(
controller: passwordController,
obscureText: true,
decoration: InputDecoration(
errorText: '$snapshot.error',
suffixIcon: Icon(Icons.visibility_off_outlined),
labelText: widget.loginModel.passwordTextfield,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(CmbSpacing.SpaceMD))),
onChanged: _validators.passwordOnChange,
),
),
如果有人能帮助我,我将不胜感激,我很困惑,因为在升级到 Flutter 2 之后,它曾经工作得很好。
Flutter 2 中的 StreamBuilder 有什么新东西吗?
编辑:
我把“$snapshot.error”改成snapshot.error.toString()
现在我得到了 null。
您没有正确插入错误。
如果你想在插值之前调用一个额外的方法,你必须将表达式包装在 ${}
中,例如'${snapshot.error}
。在您的情况下,您只是将 .error
附加到 snapshot
替换
errorText: '$snapshot.error'
有
errorText: snapshot.error?.toString()
// or if you want to use it in a sentence
errorText: "This is the error: ${snapshot.error}"
你必须在那边应用条件语句:
errorText: snapshot.hasError ? '${snapshot.error}' : null
我相信这会有所帮助。 :)