Flutter 使用initialValue时,setState不更新TextFormField

Flutter 使用initialValue时,setState不更新TextFormField,flutter,Flutter,各位 我使用的是Form和TextFieldForm,没有任何自己的TextEditController。有3个带有初始值的TextFieldForm(值1、值2、总计)。当我编辑第一个时,Total textfield应该包含计算结果。要更新小部件,我正在使用setState。变量_total和Text小部件始终具有正确的计算值,但total textfield不希望更新 为什么??可以不使用自己的TextEditController吗 import 'package:flutter/mate

各位

我使用的是Form和TextFieldForm,没有任何自己的TextEditController。有3个带有初始值的TextFieldForm(值1、值2、总计)。当我编辑第一个时,Total textfield应该包含计算结果。要更新小部件,我正在使用setState。变量_total和Text小部件始终具有正确的计算值,但total textfield不希望更新

为什么??可以不使用自己的TextEditController吗

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TestForm(),
    );
  }
}

class TestForm extends StatefulWidget {
  @override
  _TestFormState createState() => _TestFormState();
}

class _TestFormState extends State<TestForm> {
  GlobalKey<FormState> _formKey = GlobalKey();

  int _value1 = 0;
  int _value2 = 20;
  int _total = 0;

  @override
  Widget build(BuildContext context) {
    print('rebuild');
    return Scaffold(
      appBar: AppBar(title: Text('test form')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: ListView(
            children: <Widget>[
              TextFormField(
                initialValue: _value1.toString(),
                decoration: InputDecoration(
                  labelText: 'Value_1',
                ),
                keyboardType: TextInputType.number,
                onChanged: (value) {
                  setState(() {
                    _total = int.parse(value) * _value2;
                    print('total: ' + _total.toString());
                  });
                },
              ),
              TextFormField(
                initialValue: _value2.toString(),
                keyboardType: TextInputType.number,
                 decoration: InputDecoration(
                  labelText: 'Value_2',
                ),
              ),
              TextFormField(
                initialValue: _total.toString(),
                keyboardType: TextInputType.number,
                 decoration: InputDecoration(
                  labelText: 'Total',
                ),
              ),
              SizedBox(height: 20),
              Text('total: ' + _total.toString()),
            ],
          ),
        ),
      ),
    );
  }
}


导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
home:TestForm(),
);
}
}
类TestForm扩展了StatefulWidget{
@凌驾
_TestFormState createState();
}
类_TestFormState扩展了状态{
GlobalKey _formKey=GlobalKey();
int _值1=0;
int _值2=20;
int _total=0;
@凌驾
小部件构建(构建上下文){
打印(“重建”);
返回脚手架(
appBar:appBar(标题:文本(“测试表单”),
主体:填充物(
填充:常数边集全部(16.0),
孩子:表格(
键:_formKey,
子:ListView(
儿童:[
TextFormField(
initialValue:_value1.toString(),
装饰:输入装饰(
labelText:“值_1”,
),
键盘类型:TextInputType.number,
一旦更改:(值){
设置状态(){
_总计=int.parse(值)*\u值2;
打印('total:'+_total.toString());
});
},
),
TextFormField(
initialValue:_value2.toString(),
键盘类型:TextInputType.number,
装饰:输入装饰(
labelText:“值_2”,
),
),
TextFormField(
initialValue:_total.toString(),
键盘类型:TextInputType.number,
装饰:输入装饰(
labelText:'总计',
),
),
尺寸箱(高度:20),
Text('total:'+_total.toString()),
],
),
),
),
);
}
}

如果您有一个反应式数据源,即可以根据网络更新或其他数据进行更改的数据,对我有效的一个黑客就是使用一个

通过对反应数据(
toString()
)设置
),表单字段将在每次
更改时更改

因此,在这种情况下,您可以:

TextFormField(
  key: Key(_total.toString()), // <- Magic!
  initialValue: _total.toString(),
  keyboardType: TextInputType.number,
  decoration: InputDecoration(
    labelText: 'Total',
  ),
),
TextFormField(

key:key(_total.toString()),//因为它只是一个初始值,而不是您设置为TextFormField的值,可能设置了state only rebuild小部件,但不是它的初始值。请尝试此[link]()不,这是不可能的-使用
控制器
属性而不是
初始值
顺便问一下,使用
TextEditController
有什么问题吗?您的代码更复杂,不可读吗?TextEditController没有什么问题,但对我来说使用TextFormField和默认控制器有点奇怪,没有任何简单的选项使用是用于管理值的控制器。表单中的20个字段=20个自己的控制器,这太复杂了。可能的重复我有一个类似的问题,初始值不会更新,似乎总是滞后。这为我解决了它。Life Saver bro:D由于数据量大,我不想使用控制器。这是我实现的解决方案,但值没有更新,但您的建议解决了问题。