Flutter 在颤振区和rxd中处理

Flutter 在颤振区和rxd中处理,flutter,dart,Flutter,Dart,当我得到对api状态错误的响应时,我尝试使用rxdart和Flatter bloc。然后,当我再次尝试输入一个数字时,火灾响应突然再次出现,即使我输入的数字还不是6位数,所以它不应该发出API请求。为什么会突然发出火灾请求呢? 集团: 类PinBloc使用验证器扩展对象{ 最终_repository=EresidenceRepository(); final _pin=行为主体(); 最终行为主体_subject=行为主体(); 共享引用SPref; 函数(字符串)get pin=>\u pin

当我得到对api状态错误的响应时,我尝试使用rxdart和Flatter bloc。然后,当我再次尝试输入一个数字时,火灾响应突然再次出现,即使我输入的数字还不是6位数,所以它不应该发出API请求。为什么会突然发出火灾请求呢?
集团:

类PinBloc使用验证器扩展对象{
最终_repository=EresidenceRepository();
final _pin=行为主体();
最终行为主体_subject=行为主体();
共享引用SPref;
函数(字符串)get pin=>\u pin.sink.add;
login()异步{
_subject.sink.add(ApiResponse.load(“登录…”));
试一试{
sPrefs=等待SharedReferences.getInstance();
LoginResponses响应=等待_repository.login(
sPrefs.getString(“userid”)、_pin.value、sPrefs.getString(“imei”)、sPrefs.getString(“坐标”);
_subject.sink.add(ApiResponse.completed(response));
}捕获(e){
打印(如toString());
_subject.sink.add(ApiResponse.error(例如toString());
}
}
处置{
_pin.close();
_subject.close();
}
行为主体get subject=>\u subject;
}
视图:

class _PinPageState extends State<PinPage> {
PinBloc _pinBloc;
String code = "";
String number;

@override
void initState() {
  _pinBloc = PinBloc();
  super.initState();
}

@override
void dispose() {
  _pinBloc.dispose();
  super.dispose();
}

@override
Widget build(BuildContext context) {
  return FlutterEasyLoading(
    child: Scaffold(
      backgroundColor: Colors.white,
      appBar: PreferredSize(
        child: AppBarSub(name: "", onPressed:() => AppRoutes.pop(context)),
        preferredSize: Size.fromHeight(kToolbarHeight),
      ),
      body: StreamBuilder(
          stream: _pinBloc.subject,
          builder: (context, AsyncSnapshot<ApiResponse<LoginResponses>> snapshot){
            if(snapshot.hasData) {
              switch (snapshot.data.status) {
                case Status.LOADING:
                  _onWidgetDidBuild((){
                    EasyLoading.show(status: snapshot.data.message);
                  });
                  break;
                case Status.COMPLETED:
                  LoginResponses result = snapshot.data.data;
                  print(snapshot.data.data);
                  if(result.data.bit70 == "000") {
                    _onWidgetDidBuild((){
                      EasyLoading.dismiss();
                      AppRoutes.replace(context, LoginVerifyPage());
                    });
                  }else{
                    _onWidgetDidBuild((){
                      EasyLoading.dismiss();
                      AppRoutes.pushAndRemoveUntil(context, beranda);
                    });
                  }
                  break;
                case Status.ERROR:
                  print(snapshot.data.message);
                  _onWidgetDidBuild(() {
                    EasyLoading.dismiss();
                    SnackbarCustome().ScackbarReponses(context, snapshot.data.message);
                  });
                  break;
              }
            }
            return _formPin();
          }
      ),
    ),
  );
}

_formPin(){
  return Column(
    mainAxisSize: MainAxisSize.max,
    children: <Widget>[
      Expanded(
        child: FittedBox(
          fit: BoxFit.none,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Padding(
                padding: EdgeInsets.only(bottom: SizeConfig.heightMultiplier * 7),
                child: Text(
                  "Masukkan Kode Keamanan",
                  style: AppTheme.styleSubTitleBoldMedium3,
                ),
              ),
              Container(
                child: Wrap(
                  children: <Widget>[
                    buildCodeNumberBox(code.length > 0 ? code.substring(0, 1) : ""),
                    buildCodeNumberBox(code.length > 1 ? code.substring(1, 2) : ""),
                    buildCodeNumberBox(code.length > 2 ? code.substring(2, 3) : ""),
                    buildCodeNumberBox(code.length > 3 ? code.substring(3, 4) : ""),
                    buildCodeNumberBox(code.length > 4 ? code.substring(4, 5) : ""),
                    buildCodeNumberBox(code.length > 5 ? code.substring(5, 6) : ""),
                  ],
                ),
              ),
              Padding(
                padding: EdgeInsets.only(top: SizeConfig.heightMultiplier * 3),
                child: GestureDetector(
                  onTap: () => AppRoutes.pushNamed(context, forgotPass),
                  child: Text(
                    "Lupa PIN ?",
                    style: AppTheme.styleSubTitlePurpelBold,
                  ),
                ),
              )
            ],
          ),
        ),
      ),
      NumericPad(
        onNumberSelected: (value) {
          setState(() {
            if(value != -1){
              if(code.length < 6){
                code = code + value.toString();
                if(code.length == 6){
                  print(code);
                  _pinBloc.pin(code);
                  _pinBloc.login();
                  code = "";
                }
              }
            } else{
              code = code.substring(0, code.length - 1);
            }
          });
        },
      ),
    ],
  );
}

void _onWidgetDidBuild(Function callback) {
  WidgetsBinding.instance.addPostFrameCallback((_) {
    callback();
  });
}

Widget buildCodeNumberBox(String codeNumber) {
  TextEditingController _number = new TextEditingController();
  _number.text = codeNumber;
  return Container(
    margin: EdgeInsets.symmetric(horizontal: SizeConfig.widthMultiplier * 1),
    alignment: Alignment.center,
    width: SizeConfig.heightMultiplier * 5,
    height: SizeConfig.heightMultiplier * 5,
    decoration: BoxDecoration(
      color: Colors.black12.withOpacity(0.04),
      border: Border(bottom: BorderSide(color: Colors.black38)),
    ),
    padding: EdgeInsets.symmetric(horizontal: SizeConfig.heightMultiplier * 1, vertical: SizeConfig.heightMultiplier * 5.7),
    child: Center(
      child: TextField(
        controller: _number,
        decoration: new InputDecoration(
          border: InputBorder.none,
        ),
        obscureText: true,
        style: TextStyle(
            fontSize: SizeConfig.heightMultiplier * 5
        )
      ),
    ),
  );
}
}
class\u PinPageState扩展状态{
平布洛克(PinBloc);;
字符串代码=”;
字符串编号;
@凌驾
void initState(){
_pinBloc=pinBloc();
super.initState();
}
@凌驾
无效处置(){
_pinBloc.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
回程颤振加载(
孩子:脚手架(
背景颜色:Colors.white,
appBar:首选大小(
子项:AppBarSub(名称:),onPressed:()=>AppRoutes.pop(上下文)),
preferredSize:Size.fromHeight(kToolbarHeight),
),
正文:StreamBuilder(
流:_pinBloc.subject,
生成器:(上下文,异步快照){
if(snapshot.hasData){
开关(快照、数据、状态){
案例状态。正在加载:
_onWidgetDidBuild(){
EasyLoading.show(状态:snapshot.data.message);
});
打破
案例状态。已完成:
LoginResponses结果=snapshot.data.data;
打印(快照、数据、数据);
如果(result.data.bit70==“000”){
_onWidgetDidBuild(){
轻松加载;
replace(上下文,LoginVerifyPage());
});
}否则{
_onWidgetDidBuild(){
轻松加载;
批准。推送和移动直到(上下文,贝兰达);
});
}
打破
案例状态。错误:
打印(快照、数据、消息);
_onWidgetDidBuild(){
轻松加载;
SnackbarCustome().scackbarreposes(上下文、快照、数据、消息);
});
打破
}
}
返回_formPin();
}
),
),
);
}
_formPin(){
返回列(
mainAxisSize:mainAxisSize.max,
儿童:[
扩大(
孩子:FittedBox(
适合:BoxFit.none,
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
填充物(
填充:仅限边缘设置(底部:SizeConfig.heightMultiplier*7),
子:文本(
“Masukkan Kode Keamanan”,
样式:AppTheme.styleSubTitleBoldMedium3,
),
),
容器(
孩子:包裹(
儿童:[
buildCodeNumberBox(code.length>0?code.substring(0,1):“”),
buildCodeNumberBox(code.length>1?code.substring(1,2):“”),
buildCodeNumberBox(code.length>2?code.substring(2,3):“”),
buildCodeNumberBox(code.length>3?code.substring(3,4):“”),
buildCodeNumberBox(code.length>4?code.substring(4,5):“”),
buildCodeNumberBox(code.length>5?code.substring(5,6):“”),
],
),
),
填充物(
填充:仅限边集(顶部:SizeConfig.heightMultiplier*3),
儿童:手势检测器(
onTap:()=>AppRoutes.pushNamed(上下文,forgotPass),
子:文本(
“卢帕瓶?”,
样式:AppTheme.styleSubtitlePurpleBold,
),
),
)
],
),
),
),
数字键盘(
onNumberSelected:(值){
设置状态(){
如果(值!=-1){
如果(代码长度<6){
code=code+value.toString();
if(code.length==6){
打印(代码);
_pinBloc.pin(代码);
_pinBloc.login();
代码=”;
}
}
}否则{
code=code.substring(0,code.length-1);
}
});
},
),
],
);
}
void\u onWidgetDidBuild(函数回调){
WidgetsBinding.instance.addPostFrameCallback((){
回调();
});
}
小部件buildCodeNumberBox(字符串代码){
TextEditingController _number=新的TextEditingController();
_number.text=代码编号;
返回容器(
边距:边集。对称(水平:SizeConfig.Width乘数*1),
对齐:对齐.center,
宽度:SizeFig.Height乘数*5,
高度:SizeFig.height乘数*5,
装饰:盒子装饰(
颜色:颜色。黑色12。不透明度(0.04),
边框:边框(底部:BorderSide(颜色:Colors.black38)),
),
填充:边集。对称(水平:SizeCon
class _PinPageState extends State<PinPage> {
PinBloc _pinBloc;
String code = "";
String number;

@override
void initState() {
  _pinBloc = PinBloc();
  super.initState();
}

@override
void dispose() {
  _pinBloc.dispose();
  super.dispose();
}

@override
Widget build(BuildContext context) {
  return FlutterEasyLoading(
    child: Scaffold(
      backgroundColor: Colors.white,
      appBar: PreferredSize(
        child: AppBarSub(name: "", onPressed:() => AppRoutes.pop(context)),
        preferredSize: Size.fromHeight(kToolbarHeight),
      ),
      body: StreamBuilder(
          stream: _pinBloc.subject,
          builder: (context, AsyncSnapshot<ApiResponse<LoginResponses>> snapshot){
            if(snapshot.hasData) {
              switch (snapshot.data.status) {
                case Status.LOADING:
                  _onWidgetDidBuild((){
                    EasyLoading.show(status: snapshot.data.message);
                  });
                  break;
                case Status.COMPLETED:
                  LoginResponses result = snapshot.data.data;
                  print(snapshot.data.data);
                  if(result.data.bit70 == "000") {
                    _onWidgetDidBuild((){
                      EasyLoading.dismiss();
                      AppRoutes.replace(context, LoginVerifyPage());
                    });
                  }else{
                    _onWidgetDidBuild((){
                      EasyLoading.dismiss();
                      AppRoutes.pushAndRemoveUntil(context, beranda);
                    });
                  }
                  break;
                case Status.ERROR:
                  print(snapshot.data.message);
                  _onWidgetDidBuild(() {
                    EasyLoading.dismiss();
                    SnackbarCustome().ScackbarReponses(context, snapshot.data.message);
                  });
                  break;
              }
            }
            return _formPin();
          }
      ),
    ),
  );
}

_formPin(){
  return Column(
    mainAxisSize: MainAxisSize.max,
    children: <Widget>[
      Expanded(
        child: FittedBox(
          fit: BoxFit.none,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Padding(
                padding: EdgeInsets.only(bottom: SizeConfig.heightMultiplier * 7),
                child: Text(
                  "Masukkan Kode Keamanan",
                  style: AppTheme.styleSubTitleBoldMedium3,
                ),
              ),
              Container(
                child: Wrap(
                  children: <Widget>[
                    buildCodeNumberBox(code.length > 0 ? code.substring(0, 1) : ""),
                    buildCodeNumberBox(code.length > 1 ? code.substring(1, 2) : ""),
                    buildCodeNumberBox(code.length > 2 ? code.substring(2, 3) : ""),
                    buildCodeNumberBox(code.length > 3 ? code.substring(3, 4) : ""),
                    buildCodeNumberBox(code.length > 4 ? code.substring(4, 5) : ""),
                    buildCodeNumberBox(code.length > 5 ? code.substring(5, 6) : ""),
                  ],
                ),
              ),
              Padding(
                padding: EdgeInsets.only(top: SizeConfig.heightMultiplier * 3),
                child: GestureDetector(
                  onTap: () => AppRoutes.pushNamed(context, forgotPass),
                  child: Text(
                    "Lupa PIN ?",
                    style: AppTheme.styleSubTitlePurpelBold,
                  ),
                ),
              )
            ],
          ),
        ),
      ),
      NumericPad(
        onNumberSelected: (value) {
          setState(() {
            if(value != -1){
              if(code.length < 6){
                code = code + value.toString();
                if(code.length == 6){
                  print(code);
                  _pinBloc.pin(code);
                  _pinBloc.login();
                  code = "";
                }
              }
            } else{
              code = code.substring(0, code.length - 1);
            }
          });
        },
      ),
    ],
  );
}

void _onWidgetDidBuild(Function callback) {
  WidgetsBinding.instance.addPostFrameCallback((_) {
    callback();
  });
}

Widget buildCodeNumberBox(String codeNumber) {
  TextEditingController _number = new TextEditingController();
  _number.text = codeNumber;
  return Container(
    margin: EdgeInsets.symmetric(horizontal: SizeConfig.widthMultiplier * 1),
    alignment: Alignment.center,
    width: SizeConfig.heightMultiplier * 5,
    height: SizeConfig.heightMultiplier * 5,
    decoration: BoxDecoration(
      color: Colors.black12.withOpacity(0.04),
      border: Border(bottom: BorderSide(color: Colors.black38)),
    ),
    padding: EdgeInsets.symmetric(horizontal: SizeConfig.heightMultiplier * 1, vertical: SizeConfig.heightMultiplier * 5.7),
    child: Center(
      child: TextField(
        controller: _number,
        decoration: new InputDecoration(
          border: InputBorder.none,
        ),
        obscureText: true,
        style: TextStyle(
            fontSize: SizeConfig.heightMultiplier * 5
        )
      ),
    ),
  );
}
}