Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在状态更改时保留新的TextFormField值?_Flutter - Fatal编程技术网

Flutter 如何在状态更改时保留新的TextFormField值?

Flutter 如何在状态更改时保留新的TextFormField值?,flutter,Flutter,我想用int值创建很多TextFormField。如果用户更改了TextFormField值,我会将FAB设置为可见。这样用户可以在点击FAB时保存新值。但是Setstate有一个问题。当用户更改TextFormField值时,它的触发器一次更改,我在Setstate中设置为FAB可见。当我使用Setstate时,它会重置TextFormFields到初始值。如何避免此问题 谢谢 这是我的示例代码 import 'package:flutter/material.dart'; import 'p

我想用int值创建很多TextFormField。如果用户更改了TextFormField值,我会将FAB设置为可见。这样用户可以在点击FAB时保存新值。但是Setstate有一个问题。当用户更改TextFormField值时,它的触发器一次更改,我在Setstate中设置为FAB可见。当我使用Setstate时,它会重置TextFormFields到初始值。如何避免此问题

谢谢

这是我的示例代码

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