Flutter 颤振形式提供程序字段的奇怪行为
我发现了弗利特和提供者。我和提供者的第一个项目是制作表单,但我有点困惑Flutter 颤振形式提供程序字段的奇怪行为,flutter,dart,Flutter,Dart,我发现了弗利特和提供者。我和提供者的第一个项目是制作表单,但我有点困惑 我的项目: 如果我在没有填写字段的情况下验证表单,字段将显示一个错误,我将显示一个错误通知栏。我还有一个按钮来清除表单,它应该删除所有数据,如果有错误,则显示错误,并且仅当表单有数据要清除时才显示通知栏 我的问题: 当我想验证我的空表单时,所有字段都变为红色,并显示我的通知栏。 然后,如果我单击表单的delete按钮,字段将恢复正常,不会出现错误。但有时这种行为没有发生,表单的错误仍然很明显 这里有一个例子,说明一切都是
我的项目: 如果我在没有填写字段的情况下验证表单,字段将显示一个错误,我将显示一个错误通知栏。我还有一个按钮来清除表单,它应该删除所有数据,如果有错误,则显示错误,并且仅当表单有数据要清除时才显示通知栏
我的问题: 当我想验证我的空表单时,所有字段都变为红色,并显示我的通知栏。 然后,如果我单击表单的delete按钮,字段将恢复正常,不会出现错误。但有时这种行为没有发生,表单的错误仍然很明显 这里有一个例子,说明一切都是正确的。我用2填充距离字段,单击提交然后删除,然后提交然后删除。将删除字段并删除错误。在我第二次提交时,我没有收到绿色通知,因为表单是空的 在我重新启动应用程序并出现错误后立即执行。我点击提交然后删除。错误不会消失。。。此外,如果我点击我的距离字段,它会给我输入的旧值(值2),而我没有在键盘上键入 如何解释这一点? 我的屏幕页面:
class CalculatorScreen extends StatefulWidget{
CalculatorScreen({Key key}) : super(key: key);
@override
_CalculatorScreenState createState() => _CalculatorScreenState();
}
class _CalculatorScreenState extends State<CalculatorScreen> {
TextEditingController controllerDistance;
TextEditingController controllerValue ;
@override
void initState()
{
controllerDistance = TextEditingController();
controllerValue = TextEditingController();
super.initState();
}
@override
void dispose()
{
controllerDistance.dispose();
controllerValue.dispose();
super.dispose();
}
@override
Widget build(BuildContext context)
{
return GestureDetector(
onTap: (() => FocusScope.of(context).requestFocus(FocusNode())),
child: Scaffold(
body : _buildBody(context)
),
);
}
Widget _buildBody(BuildContext context)
{
var _formCalculatorProvider = Provider.of<FormCalculatorNotifier>(context, listen:false);
return SingleChildScrollView(
child: Column(
children: [
ContainerComponent(
background: AppColors.colorBgLight,
children: [
Form(
key : _formCalculatorProvider.formGlobalKey,
autovalidate: _formCalculatorProvider.autovalidateError,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//----------------------------------------------
LabelComponent(AppTextForm.DISTANCE_LABEL),
InputComponent(
controller: controllerDistance,
keyboard : TextInputType.number,
placeholder: AppTextForm.DISTANCE_PLACEHOLDER,
onChanged: (var value) {
_formCalculatorProvider.saveDistance(value);
},
validator: (String value){
return FormValidatorService.isDistanceValid(value);
}
),
//----------------------------------------------
LabelComponent(AppTextForm.VALUE_LABEL),
InputComponent(
controller: controllerValue,
keyboard : TextInputType.number,
placeholder: AppTextForm.VALUE_PLACEHOLDER,
onChanged: (var value) {
_formCalculatorProvider.saveValue(value);
},
validator: (String value){
return FormValidatorService.isValueValid(value);
}
),
]
)
],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: ButtonComponent.secondary(
context: context,
text: AppTextButton.ERASE,
onPressed: (){
_formCalculatorProvider.clearForm(context);
},
),
),
Expanded(
child: ButtonComponent.primary(
context: context,
text: AppTextButton.CALCUL,
onPressed: (){
_formCalculatorProvider.submitForm(context);
},
),
),
],
),
],
)
],
),
);
}
}
class FormCalculatorNotifier extends FormNotifier {
FormCalculatorModel formData = FormCalculatorModel();
void saveDistance(String value){
formData.distance = num.tryParse(value).round();
notifyListeners();
}
void saveValue(String value){
formData.value = num.tryParse(value).round();
notifyListeners();
}
@override
void clearAllData() {
super.clearAllData();
formState = FormDataState.isEmpty;
formGlobalKey.currentState.reset();
autovalidateError = false;
formData = FormCalculatorModel();
notifyListeners();
}
@override
void clearFormAutorisation(){
super.clearFormAutorisation();
if(!FormCalculatorModel.isEmpty(formData)){
formState = FormDataState.isNotEmpty;
notifyListeners();
}
}
}
class FormCalculatorNotifier extends FormNotifier {
FormCalculatorModel formData = FormCalculatorModel();
void saveDistance(String value){
formData.distance = num.tryParse(value).round();
notifyListeners();
}
void saveValue(String value){
formData.value = num.tryParse(value).round();
notifyListeners();
}
@override
void clearAllData() {
super.clearAllData();
formState = FormDataState.isEmpty;
formGlobalKey.currentState.reset();
autovalidateError = false;
formData = FormCalculatorModel();
notifyListeners();
}
@override
void clearFormAutorisation(){
super.clearFormAutorisation();
if(!FormCalculatorModel.isEmpty(formData)){
formState = FormDataState.isNotEmpty;
notifyListeners();
}
}
}