如果我使用類物件更新變數,則應該呼叫 build 方法,但我無法從 StatefulWidget 類呼叫 setState。
class CustomErrorFormField extends StatefulWidget {
@override
_CustomErrorFormFieldState createState() {
return _CustomErrorFormFieldState();
}
List<String> errorList = []; //this variable will get updated using below function
void setErrorList(List<String> listOfError) {
errorList = listOfError;
}
}
class _CustomErrorFormFieldState extends State<CustomErrorFormField> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
print(widget.errorList); //this is not printing updated value
return .....
}
}
現在在其他一些類中,我將更新errorList變數
nameTextFild = CustomErrorFormField(
key: ValueKey(count),
labelName: "Name",
iContext: context,
onChanged: (String value) {
setState(() {
count ;
if (!value.contains(RegExp(r'[0-9]'))) {
nameTextFild!.setErrorList([]); //updating but changes not appearing (setState of this widget is not getting called)
} else {
nameTextFild!.setErrorList(["Invalid characters, use letters only."]);
}
});
},
);
uj5u.com熱心網友回復:
不建議您從小部件外部更改小部件的狀態。
您應該做的是將驗證邏輯作為 a 傳遞,function并讓小部件處理狀態更改。
自定義表單欄位:
import 'package:flutter/material.dart';
class CustomErrorFormField extends StatefulWidget {
//Take the validation logic as a parameter.
final List<String> Function(String value) validator;
const CustomErrorFormField({required this.validator});
@override
_CustomErrorFormFieldState createState() {
return _CustomErrorFormFieldState();
}
}
class _CustomErrorFormFieldState extends State<CustomErrorFormField> {
//Keep the state inside the widget itself
List<String> errorList = [];
//Update the state from inside the widget
void setErrorList(List<String> listOfError) {
setState(() {
errorList = listOfError;
});
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Form(
child: TextFormField(
validator: (String value){
//Use the validation logic to decide the error.
setErrorList(widget.validator(value))
}
}
),
);
}
}
我以我TextFormField為例,您可以使用任何callback在更改時接受 a 的小部件。
如果您從頭開始制作所有內容,則可以將該validator函式附加到callback文本更改時觸發的 a 。通常這是在controller.
用法:
final nameTextFild = CustomErrorFormField(
key: ValueKey(count),
labelName: "Name",
iContext: context,
validator: (String value) {
if (!value.contains(RegExp(r'[0-9]'))) {
return [];
} else {
return ["Invalid characters, use letters only."];
}
},
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/453227.html
