Flutter 如何在状态更改时保留新的TextFormField值?
我想用int值创建很多TextFormField。如果用户更改了TextFormField值,我会将FAB设置为可见。这样用户可以在点击FAB时保存新值。但是Setstate有一个问题。当用户更改TextFormField值时,它的触发器一次更改,我在Setstate中设置为FAB可见。当我使用Setstate时,它会重置TextFormFields到初始值。如何避免此问题 谢谢 这是我的示例代码Flutter 如何在状态更改时保留新的TextFormField值?,flutter,Flutter,我想用int值创建很多TextFormField。如果用户更改了TextFormField值,我会将FAB设置为可见。这样用户可以在点击FAB时保存新值。但是Setstate有一个问题。当用户更改TextFormField值时,它的触发器一次更改,我在Setstate中设置为FAB可见。当我使用Setstate时,它会重置TextFormFields到初始值。如何避免此问题 谢谢 这是我的示例代码 import 'package:flutter/material.dart'; import 'p
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
bool FabVisible = false;
final List<TextEditingController> controllers = List.generate(6, (index) {
return TextEditingController();
});
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: SafeArea(
child: Scaffold(
floatingActionButton: FAB(),
body: Center(
child: MyWidget(),
),
),
),
);
}
FloatingActionButton FAB() {
return FabVisible
? FloatingActionButton(onPressed: () {}, child: Icon(Icons.save))
: null;
}
}
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
// final TextEditingController controller = TextEditingController();
// final TextEditingController controller2 = TextEditingController();
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
SingleChildScrollView(
child: Column(
children: textFields(),
),
),
],
);
}
List<TextFormField> textFields() {
List<TextFormField> trash = List();
for (int i = 0; i <= 5; i++) {
TextEditingController controller = controllers[i];
controller.value = TextEditingValue(
text: 10.toString(),
selection: TextSelection.fromPosition(
TextPosition(offset: (10.toString()).length)));
trash.add(
TextFormField(
onChanged: (txt) {
controller.value = TextEditingValue(
text: txt,
selection: TextSelection.fromPosition(
TextPosition(offset: txt.length),
));
setState(() {
FabVisible = true;
});
},
keyboardType: TextInputType.number,
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
controller: controller,
style: TextStyle(color: Colors.white),
textAlign: TextAlign.center,
decoration: InputDecoration.collapsed(
hintText: "",
fillColor: Colors.teal,
focusColor: Colors.yellow,
),
),
);
}
return trash;
}
}
导入“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
最终颜色深蓝色=颜色。来自argb(255,18,32,47);
bool=false;
最终列表控制器=List.generate(6,(索引){
返回TextEditingController();
});
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:ThemeData.dark().copyWith(脚手架背景颜色:深蓝色),
debugShowCheckedModeBanner:false,
家:安全区(
孩子:脚手架(
floatingActionButton:FAB(),
正文:中(
子项:MyWidget(),
),
),
),
);
}
浮动操作按钮FAB(){
返回FabVisible
?浮动操作按钮(按下时:(){},子项:图标(Icons.save))
:null;
}
}
类MyWidget扩展了StatefulWidget{
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
//最终文本编辑控制器控制器=文本编辑控制器();
//最终TextEditingController控制器2=TextEditingController();
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
SingleChildScrollView(
子:列(
子项:textFields(),
),
),
],
);
}
列表文本字段(){
列表垃圾=List();
对于(int i=0;i当您调用setState()
时,它会重建小部件,因此再次调用textFields()
函数。为了避免这种情况,我建议利用initState()
initState()
仅在第一次加载屏幕时才会被调用
让我们看看如何使用这个:
class _MyWidgetState extends State<MyWidget> {
// final TextEditingController controller = TextEditingController();
// final TextEditingController controller2 = TextEditingController();
final List<Widget> children = [];
@override
void initState() {
textFields();
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
SingleChildScrollView(
child: Column(
children: children,
),
),
],
);
}
void textFields() {
for (int i = 0; i <= 5; i++) {
TextEditingController controller = controllers[i];
controller.value = TextEditingValue(
text: "10", // same thing as 10.toString()
selection: TextSelection.fromPosition(
TextPosition(offset: ("10").length)));
children.add(
TextFormField(
onChanged: (txt) {
controller.value = TextEditingValue(
text: txt,
selection: TextSelection.fromPosition(
TextPosition(offset: txt.length),
));
setState(() {
FabVisible = true;
});
},
keyboardType: TextInputType.number,
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
controller: controller,
style: TextStyle(color: Colors.white),
textAlign: TextAlign.center,
decoration: InputDecoration.collapsed(
hintText: "",
fillColor: Colors.teal,
focusColor: Colors.yellow,
),
),
);
}
}
}
class\u MyWidgetState扩展状态{
//最终文本编辑控制器控制器=文本编辑控制器();
//最终TextEditingController控制器2=TextEditingController();
最终列表子项=[];
@凌驾
void initState(){
textFields();
}
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
SingleChildScrollView(
子:列(
儿童:儿童,,
),
),
],
);
}
void textFields(){
对于(int i=0;i