首页 > 解决方案 > 我有一个表单,其中有两个文本输入。当用户在一个输入中输入文本并转到另一个时,文本消失了。该怎么办?

问题描述

我有一个表单,其中有两个文本输入。当用户在一个输入中输入文本并转到另一个时,文本消失了。怎么办?有四个 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,
                    ),
                    
                  ],
                ),
              ));      
    
  }
}

我像 main.dart一样从 Main 调用它

标签: flutterdart

解决方案


其因为NewTransactionStatelessWidget。当setState从其父级调用titleController并将amountController被重新创建。所以该值将为空。

解决方案:

制作NewTransactionStatefulWidget.

解释:

StatefulWidget有它们的状态(一种单独的运行时内存块存储来存储变量的值)。因此,即使父小部件重建,StateStatefulWidget不会重新创建。它将与以前的持久值一起重用。

但是StatelessWidget没有状态(不会维护变量的值)。因此,如果父小部件得到重建,那么这StatelessWidget也会重建。这意味着所有变量都titleControlleramountController被删除并重新创建(使用空值)。


推荐阅读