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