如何获取Flutter 2中的snapshot.error?

sxn*_*xgx 3 mobile android ios dart flutter

我将 Flutter 应用程序更新为 Flutter 2,现在当我尝试在 StreamBuider 中获取 snapshot.error 时,我得到了这个在此输入图像描述

\n

这些是带有 Streams 的验证器。

\n
class LoginStreams with Validators {\n\n  dispose() {\n    _emailController.close();\n    _passwordController.close();\n  }\n\n  Function(String) get emailOnChange => _emailController.sink.add;\n  Function(String) get passwordOnChange => _passwordController.sink.add;\n\n  final _emailController = StreamController<String>.broadcast();\n  final _passwordController = StreamController<String>.broadcast();\n\n  Stream<String> get emailStream => \n    _emailController.stream.transform(emailValidator);\n  Stream<String> get passwordStream =>       \n _passwordController.stream.transform(passwordValidator);\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

--

\n
class Validators {\n  final passwordValidator = StreamTransformer<String, String>.fromHandlers(\n      handleData: (password, sink) {\n    password.length >= 5\n        ? sink.add(password)\n        : sink.addError("La contrase\xc3\xb1a debe contener m\xc3\xa1s de 5 caracteres");\n  });\n\n  final emailValidator =\n      StreamTransformer<String, String>.fromHandlers(handleData: (email, sink) {\n    if (email.contains(\'@\') && email.contains(\'.\')) {\n      sink.add(email);\n    } else {\n      sink.addError("Ingrese un email v\xc3\xa1lido");\n    }\n  });\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n
StreamBuilder(\n            stream: _validators.emailStream,\n            builder: (BuildContext context, AsyncSnapshot snapshot)=>TextField(\n            keyboardType: TextInputType.emailAddress,\n            controller: emailController,\n            decoration: InputDecoration(\n              errorText: \'$snapshot.error\',\n              labelText: widget.loginModel.emailTextfield,\n              border: OutlineInputBorder(\n                borderRadius: BorderRadius.circular(CmbSpacing.SpaceMD))),\n            onChanged: _validators.emailOnChange,\n            ),\n          ),\n          SizedBox(height: CmbSpacing.SpaceSM),\n          StreamBuilder(\n            stream: _validators.passwordStream,\n            builder: (BuildContext context, AsyncSnapshot snapshot)=>TextField(\n            controller: passwordController,\n            obscureText: true,\n            decoration: InputDecoration(\n              errorText: \'$snapshot.error\',\n              suffixIcon: Icon(Icons.visibility_off_outlined),\n              labelText: widget.loginModel.passwordTextfield,\n                border: OutlineInputBorder(\n                borderRadius: BorderRadius.circular(CmbSpacing.SpaceMD))),\n            onChanged: _validators.passwordOnChange,\n            ),\n          ),\n
Run Code Online (Sandbox Code Playgroud)\n

如果有人可以帮助我,我会非常感激,我很困惑,因为升级到 Flutter 2 后,这曾经工作得很好。

\n

Flutter 2 中的 StreamBuilders 有什么新东西吗?

\n

编辑:

\n

我将“$snapshot.error”更改为 snapshot.error.toString()

\n

现在我得到了空。

\n

在此输入图像描述

\n

mig*_*uno 6

您没有正确插入错误。如果您想在插值之前调用额外的方法,则必须将表达式包装在${}, 例如 中'${snapshot.error}。在你的情况下,你只是附加.error到字符串表示snapshot

代替

errorText: '$snapshot.error'
Run Code Online (Sandbox Code Playgroud)

errorText: snapshot.error?.toString()

// or if you want to use it in a sentence
errorText: "This is the error: ${snapshot.error}"
Run Code Online (Sandbox Code Playgroud)


Pra*_*ave 6

您必须在那里应用条件语句:

errorText: snapshot.hasError ? '${snapshot.error}' : null
Run Code Online (Sandbox Code Playgroud)

我确信这会有所帮助。:)