首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤动验证(BLoC pattern & rxDart)?

颤动验证(BLoC pattern & rxDart)?
EN

Stack Overflow用户
提问于 2020-04-20 11:23:45
回答 1查看 135关注 0票数 0

如何在登录页面上显示错误消息?

这是我创建的Bloc:

代码语言:javascript
复制
class LoginBloc extends Object with Validators{
  final _repository = EresidenceRepository();
  final _userid = BehaviorSubject<String>();
  final _password = BehaviorSubject<String>();
  final _imei = BehaviorSubject<String>();
  final _coordinate = BehaviorSubject<String>();
  final BehaviorSubject<ApiResponse<login_responses>> _subject = BehaviorSubject<ApiResponse<login_responses>>();

  Function(String) get userid => _userid.sink.add;
  Function(String) get password => _password.sink.add;
  Function(String) get imei => _imei.sink.add;
  Function(String) get coordinate => _coordinate.sink.add;

  Stream<String> get useridValidation => _userid.stream.transform(useridValidator);
  Stream<String> get passwordValidation => _password.stream.transform(passwordValidator);
  Stream<bool> get submitCheck => Rx.combineLatest2(useridValidation, passwordValidation, (e,p) => true);

  login() async {
    try {
      login_responses response = await _repository.login(
          _userid.value, _password.value, _imei.value, _coordinate.value);
      _subject.sink.add(ApiResponse.completed(response));

      prefsBloc.changePrefsLogin(
          PrefsState(false, response.data.userid, response.data.password, _imei.value, _coordinate.value)
      );

      print(_imei.value + " " + _coordinate.value);
      print(response);

    } catch (e) {
      _subject.sink.add(ApiResponse.error(e.toString()));
      print(e);
      print(_userid.value);
    }
  }

  dispose(){
    _userid.close();
    _password.close();
    _imei.close();
    _coordinate.close();
    _subject.close();
  }

  BehaviorSubject<ApiResponse<login_responses>> get subject => _subject;

}

final login = LoginBloc();

我已经尝试过像我的UI代码这样的方法,但在黑色背景上出现了一条错误消息。在错误状态期间,我尝试显示错误消息。我想在登录页面/登录表单上显示一条错误消息。你是怎么做到的?

希望有谁能帮我

用户界面:

代码语言:javascript
复制
 @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: StreamBuilder<ApiResponse<login_responses>>(
          stream: login.subject,
          builder: (context, snapshot){
            if(snapshot.hasData) {
              switch (snapshot.data.status) {
                case Status.LOADING:
                  break;
                case Status.COMPLETED:
                  login_responses result = snapshot.data.data;
                  print(result.data.password + " " +result.data.userid);
                  AppRoutes.push(context, OtpLoginPage());
                  break;
                case Status.ERROR:
                  return CupertinoAlertDialog(
                    title: Text(snapshot.data.message),
                    actions: <Widget>[
                      CupertinoDialogAction(
                        child: Text('OK'),
                        onPressed: () {
                          Navigator.of(context).pop();
                        },
                      ),
                    ],
                  );
                  break;
              }
            }
            print("FORM LOGIN");
            return _formLogin();
          }
      ),
    );
  }
_formLogin() {
    return AnnotatedRegion<SystemUiOverlayStyle>(
      value: SystemUiOverlayStyle.dark,
      child: Material(
          color: Colors.white,
          child: SafeArea(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Expanded(
                    flex: 1,
                    child: Container(
                        padding: EdgeInsets.symmetric(horizontal: SizeConfig.widthMultiplier * 1, vertical: SizeConfig.heightMultiplier * 1),
                        child: CachedNetworkImage(
                          imageUrl: "",
                          placeholder: (context, url) => CircularProgressIndicator(),
                          errorWidget: (context, url, error) => Icon(Icons.broken_image),
                          fit: BoxFit.fill,
                        ),
                    )
                ),
                Expanded(
                    flex: 2,
                    child: Container(
                        padding: EdgeInsets.all(SizeConfig.heightMultiplier * 2),
                        child: Column(
                          children: <Widget>[
                            Container(
                                child: StreamBuilder<String>(
                                  stream: login.useridValidation,
                                  builder: (context, snapshot) => DataTextField(
                                    errorText: snapshot.error,
                                    hintText: "No Handphone",
                                    textInputAction: TextInputAction.next,
                                    icon: Icons.phone,
                                    onSubmitted: () => FocusScope.of(context).requestFocus(passwordFocusNode),
                                    onChanged: login.userid,
                                    keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true),
                                  ),
                                )
                            ),
                            Container(
                                margin: EdgeInsets.only(top: SizeConfig.heightMultiplier * 2),
                                child: StreamBuilder<String>(
                                  stream: login.passwordValidation,
                                  builder: (context, snapshot) => PasswordTextField(
                                  errorText: snapshot.error,
                                    hintText: "Password",
                                    textInputAction: TextInputAction.done,
                                    onSubmitted: () {
                                      FocusScope.of(context).requestFocus(FocusNode());
                                    },
                                    onChanged: login.password,
                                    focusNode: passwordFocusNode,
                                  ),
                                )
                            ),
                            Container(
                                width: SizeConfig.screenWidth,
                                margin: EdgeInsets.only(top: SizeConfig.heightMultiplier * 2.5),
                                child: GestureDetector(
                                  onTap: () => AppRoutes.push(context, ForgotPasswordPage()),
                                  child: Text(
                                    Strings.titleForgotPass+" ?",
                                    style: AppTheme.styleSubTitlePurpel,
                                    textAlign: TextAlign.right,
                                  ),
                                )
                            ),
                            Container(
                              width: SizeConfig.screenWidth,
                              margin: EdgeInsets.only(top: SizeConfig.heightMultiplier * 5),
                              child: StreamBuilder<bool>(
                                stream: login.submitCheck,
                                builder: (context, snapshot) => AppButton(
                                    onPressed: snapshot.hasData ? () => login.login(context) : null,
                                    text: Strings.signin
                                ),
                              )
                            )
                          ],
                        )
                    )
                ),
                Expanded(
                    flex: 1,
                    child: Container(
                        alignment: Alignment.bottomCenter,
                        margin: EdgeInsets.only(bottom: SizeConfig.heightMultiplier * 2.5),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Text(
                              Strings.dontAccount,
                              style: AppTheme.styleSubTitleBlackSmall,
                              textAlign: TextAlign.right,
                            ),
                            Container(
                                margin: EdgeInsets.only(left: SizeConfig.widthMultiplier * 1),
                                child: InkWell(
                                  onTap: () => AppRoutes.push(context, RegistrationPage()),
                                  child: Text(
                                    Strings.registration,
                                    style: AppTheme.styleSubTitlePurpel,
                                    textAlign: TextAlign.right,
                                  ),
                                )
                            )
                          ],
                        )
                    )
                )
              ],
            ),
          )
      ),
    );
  }
}
EN

回答 1

Stack Overflow用户

发布于 2020-09-03 00:47:01

似乎你没有任何材料的“背景”,你的错误对话框。试着用脚手架或Material小部件包装你的StreamBuilder。为了设置文本字段的错误,您已经有了相应的errorStreams

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61314661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档