Flutter 为什么我的集团没有';我不工作时就不工作;不提供数据?

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

我正在为2FA身份验证构建Flutter应用程序,但是我不知道为什么,但是当我没有在表单中键入任何内容时,对话框不会显示。有人知道怎么修吗

我希望它能像这样工作:当我没有在表单中键入任何内容时,它必须显示一个警报对话框。如果我键入所有内容,则集团需要处理验证

代码: 手动\u输入\u块。省道 手动\u输入\u状态.dart 手动输入屏幕省道
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;