sxn*_*xgx 3 mobile android ios dart flutter
我将 Flutter 应用程序更新为 Flutter 2,现在当我尝试在 StreamBuider 中获取 snapshot.error 时,我得到了这个
这些是带有 Streams 的验证器。
\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\n--
\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\nStreamBuilder(\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 ),\nRun Code Online (Sandbox Code Playgroud)\n如果有人可以帮助我,我会非常感激,我很困惑,因为升级到 Flutter 2 后,这曾经工作得很好。
\nFlutter 2 中的 StreamBuilders 有什么新东西吗?
\n编辑:
\n我将“$snapshot.error”更改为 snapshot.error.toString()
\n现在我得到了空。
\n\n您没有正确插入错误。如果您想在插值之前调用额外的方法,则必须将表达式包装在${}, 例如 中'${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)
您必须在那里应用条件语句:
errorText: snapshot.hasError ? '${snapshot.error}' : null
Run Code Online (Sandbox Code Playgroud)
我确信这会有所帮助。:)
| 归档时间: |
|
| 查看次数: |
3886 次 |
| 最近记录: |