flutter - 我有一个表单,其中有两个文本输入。当用户在一个输入中输入文本并转到另一个时,文本消失了。该怎么办?
问题描述
我有一个表单,其中有两个文本输入。当用户在一个输入中输入文本并转到另一个时,文本消失了。怎么办?有四个 dart 文件 main.dart,new_transaction.dart,
表单模块
import 'package:flutter/material.dart';
class NewTransaction extends StatelessWidget {
final titleController = TextEditingController();
final amountController=TextEditingController();
final Function addTx;
NewTransaction(this.addTx);
void submitData()
{
final enterTitle =titleController.text;
final enterAmount=double.parse(amountController.text);
if (enterTitle.isEmpty||enterAmount<=0)
{return;}
addTx(enterTitle,enterAmount);
}
@override
Widget build(BuildContext context) {
return
Card(
elevation: 7,
child: Container(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'title'),
controller: titleController,
onSubmitted:(_)=>submitData(),
),
TextField(
decoration: InputDecoration(labelText: 'amount'),
controller: amountController,
keyboardType: TextInputType.number,
onSubmitted:(_)=>submitData(),
),
FlatButton(
onPressed: submitData,
child: Text('Add Transaction'),
textColor: Colors.purple,
),
],
),
));
}
}
解决方案
其因为NewTransaction
是StatelessWidget
。当setState
从其父级调用titleController
并将amountController
被重新创建。所以该值将为空。
解决方案:
制作NewTransaction
为StatefulWidget
.
解释:
StatefulWidget
有它们的状态(一种单独的运行时内存块存储来存储变量的值)。因此,即使父小部件重建,State
也StatefulWidget
不会重新创建。它将与以前的持久值一起重用。
但是StatelessWidget
没有状态(不会维护变量的值)。因此,如果父小部件得到重建,那么这StatelessWidget
也会重建。这意味着所有变量都titleController
将amountController
被删除并重新创建(使用空值)。
推荐阅读
- python - 如何从 javadoc 注释中删除 { 和 } 之间的 @link 标记及其内容?
- highcharts - Highchart 地图显示了一些已选择的状态,并具有选择其他状态的可行性
- javascript - 如何使用 fetch 发送数组?(Javascript)
- c# - 解释一些关于动态连接字符串的代码
- android - 在 genymotion 设备中运行时膨胀类 androidx.constraintlayout.widget.ConstraintLayout 时出错
- html - 如何摆脱自动填充html?
- dll-injection - 如何从我的 VSTS MSTest 管道中的另一个管道使用 VSTS 工件 DLL
- codeception - 如何修复代码接收中的此 DEPRECATION 错误?
- latex - 乳胶只写到页面中间
- powershell - 更改 O365 脚本以使用用户提示输入更改职位?