Flutter 为什么我的集团没有';我不工作时就不工作;不提供数据?
我正在为2FA身份验证构建Flutter应用程序,但是我不知道为什么,但是当我没有在表单中键入任何内容时,对话框不会显示。有人知道怎么修吗 我希望它能像这样工作:当我没有在表单中键入任何内容时,它必须显示一个警报对话框。如果我键入所有内容,则集团需要处理验证 代码: 手动\u输入\u块。省道 手动\u输入\u状态.dart 手动输入屏幕省道Flutter 为什么我的集团没有';我不工作时就不工作;不提供数据?,flutter,dart,bloc,Flutter,Dart,Bloc,我正在为2FA身份验证构建Flutter应用程序,但是我不知道为什么,但是当我没有在表单中键入任何内容时,对话框不会显示。有人知道怎么修吗 我希望它能像这样工作:当我没有在表单中键入任何内容时,它必须显示一个警报对话框。如果我键入所有内容,则集团需要处理验证 代码: 手动\u输入\u块。省道 手动\u输入\u状态.dart 手动输入屏幕省道 import'包:duckie/blocs/manual_-input/manual_-input_-bloc.dart'; 导入“package:duc
import'包:duckie/blocs/manual_-input/manual_-input_-bloc.dart';
导入“package:duckie/screens/widgets/custom_text_field.dart”;
导入“package:duckie/shared/text_styles.dart”;
进口“包装:颤振/cupertino.dart”;
进口“包装:颤振/材料.省道”;
导入“package:easy_localization/easy_localization.dart”;
进口“包装:颤振团/颤振团.飞镖”;
类ManualInputScreen扩展StatefulWidget{
@凌驾
_ManualInputScreenState createState()=>_ManualInputScreenState();
}
类_ManualInputScreenState扩展状态{
字符串加密键;
字符串发行者;
字符串accountName;
字符串数字;
字符串时间步;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:正文(
“手动输入”,
样式:TextStyles.appBarText,
).tr(),
标题:对,
标高:0.0,
行动:[
文本按钮(
已按下:(){
BlocProvider.of(上下文)。添加(
GetFormTextEvent(
secretKey、发卡机构、帐户名、numberOfDigits、timeStep),
);
BlocBuilder(
生成器:(上下文、状态){
如果(状态为手动输入程序){
showIosAlertDialog(上下文);
}
返回null;
},
);
},
子项:Text('add').tr(),
)
],
),
主体:容器(
填充:边缘设置。全部(8.0),
子:ListView(
儿童:[
自定义文本字段(
labelText:'密钥'.tr(),
一旦更改:(值){
设置状态(){
secretKey=值;
});
},
),
大小盒子(
身高:8.0,
),
自定义文本字段(
labelText:'issuer'.tr(),
一旦更改:(值){
发行人=价值;
},
),
大小盒子(
身高:8.0,
),
自定义文本字段(
labelText:'帐户名'.tr(),
一旦更改:(值){
设置状态(){
accountName=值;
});
},
),
大小盒子(
身高:8.0,
),
列表体(
儿童:[
Text('number-of-digits').tr(),
大小盒子(
身高:5.0,
),
铜中毒控制(
groupValue:'6',
儿童:{
“6”:文本(“6”),
“8”:文本(“8”),
},
onValueChanged:(值){
设置状态(){
numberOfDigits=数值;
});
},
),
],
),
大小盒子(
身高:8.0,
),
列表体(
儿童:[
Text('time-step').tr(),
大小盒子(
身高:5.0,
),
铜中毒控制(
groupValue:'30',
儿童:{
“30”:文本(“30”),
“60”:文本(“60”),
},
onValueChanged:(值){
设置状态(){
时间步长=值;
});
},
),
],
),
],
),
),
);
}
}
void showIosAlertDialog(BuildContext上下文){
显示对话框(
上下文:上下文,
建筑商:(建筑商){
返回CupertinoAlertDialog(
标题:Text('manual-input-error-title').tr(),
内容:Text('manual-input-error-content').tr(),
);
},
);
}
类MyMainWidget扩展了无状态Widget{
@凌驾
小部件构建(构建上下文){
返回BlocProvider(
创建:(上下文)=>ManualInputBloc(),
子项:ManualInputScreen(),
);
}
}
在ManualInputScreen的操作中
行动:[
布洛克斯腾纳(
侦听器:(上下文、状态){
如果(状态为手动输入程序){
showIosAlertDialog(上下文);
}
},
孩子:文本按钮(
已按下:(){
BlocProvider.of(上下文)。添加(
GetFormTextEvent(
secretKey、发卡机构、帐户名、numberOfDigits、timeStep),
);
},
子项:文本('add'),
),
)
],
此处不应使用&&而应使用| |如果所有字段都为空,则只会产生错误,因此请使用:
if (event is GetFormTextEvent) {
if (event.secretKey == null ||
event.issuer == null ||
event.accountName == null) {
yield ManualInputError();
}
要验证字符串是否为空,请尝试使用更健壮的语句:
value?.trim()?.isEmpty ?? true;
哦,是的,我完全忘记了逻辑运算符。谢谢。我会在15分钟内检查出来,然后让你知道。好的,我检查了代码,但仍然不起作用。有什么想法吗?我会添加一些print语句来查看哪些部分被调用,哪些部分不被调用,例如`if(event是GetFormTextEvent){print(“checkpoint1”);if(event.secretKey==null&&event.issuer==null&&event.accountName==null){
part of 'manual_input_bloc.dart';
@immutable
abstract class ManualInputState {
ManualInputState();
}
class ManualInputInitial extends ManualInputState {
ManualInputInitial();
}
class ManualInputError extends ManualInputState {
ManualInputError();
}
class ManualInputFinal extends ManualInputState {
final String secretKey;
final String issuer;
final String accountName;
final String numberOfDigits;
final String timeStep;
ManualInputFinal(
this.secretKey,
this.issuer,
this.accountName,
this.numberOfDigits,
this.timeStep,
);
}
import 'package:duckie/blocs/manual_input/manual_input_bloc.dart';
import 'package:duckie/screens/widgets/custom_text_field.dart';
import 'package:duckie/shared/text_styles.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class ManualInputScreen extends StatefulWidget {
@override
_ManualInputScreenState createState() => _ManualInputScreenState();
}
class _ManualInputScreenState extends State<ManualInputScreen> {
String secretKey;
String issuer;
String accountName;
String numberOfDigits;
String timeStep;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'manual-input',
style: TextStyles.appBarText,
).tr(),
centerTitle: true,
elevation: 0.0,
actions: [
TextButton(
onPressed: () {
BlocProvider.of<ManualInputBloc>(context).add(
GetFormTextEvent(
secretKey, issuer, accountName, numberOfDigits, timeStep),
);
BlocBuilder<ManualInputBloc, ManualInputState>(
builder: (context, state) {
if (state is ManualInputError) {
showIosAlertDialog(context);
}
return null;
},
);
},
child: Text('add').tr(),
)
],
),
body: Container(
padding: EdgeInsets.all(8.0),
child: ListView(
children: [
CustomTextField(
labelText: 'secret-key'.tr(),
onChanged: (value) {
setState(() {
secretKey = value;
});
},
),
SizedBox(
height: 8.0,
),
CustomTextField(
labelText: 'issuer'.tr(),
onChanged: (value) {
issuer = value;
},
),
SizedBox(
height: 8.0,
),
CustomTextField(
labelText: 'account-name'.tr(),
onChanged: (value) {
setState(() {
accountName = value;
});
},
),
SizedBox(
height: 8.0,
),
ListBody(
children: [
Text('number-of-digits').tr(),
SizedBox(
height: 5.0,
),
CupertinoSegmentedControl(
groupValue: '6',
children: {
'6': Text('6'),
'8': Text('8'),
},
onValueChanged: (value) {
setState(() {
numberOfDigits = value;
});
},
),
],
),
SizedBox(
height: 8.0,
),
ListBody(
children: [
Text('time-step').tr(),
SizedBox(
height: 5.0,
),
CupertinoSegmentedControl(
groupValue: '30',
children: {
'30': Text('30'),
'60': Text('60'),
},
onValueChanged: (value) {
setState(() {
timeStep = value;
});
},
),
],
),
],
),
),
);
}
}
void showIosAlertDialog(BuildContext context) {
showDialog(
context: context,
builder: (builder) {
return CupertinoAlertDialog(
title: Text('manual-input-error-title').tr(),
content: Text('manual-input-error-content').tr(),
);
},
);
}
class MyMainWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => ManualInputBloc(),
child: ManualInputScreen(),
);
}
}
and in ManualInputScreen's action
actions: [
BlocListener<ManualInputBloc, ManualInputState>(
listener: (context, state) {
if (state is ManualInputError) {
showIosAlertDialog(context);
}
},
child: TextButton(
onPressed: () {
BlocProvider.of<ManualInputBloc>(context).add(
GetFormTextEvent(
secretKey, issuer, accountName, numberOfDigits, timeStep),
);
},
child: Text('add'),
),
)
],
if (event is GetFormTextEvent) {
if (event.secretKey == null &&
event.issuer == null &&
event.accountName == null) {
yield ManualInputError();
}
if (event is GetFormTextEvent) {
if (event.secretKey == null ||
event.issuer == null ||
event.accountName == null) {
yield ManualInputError();
}
value?.trim()?.isEmpty ?? true;