TextField返回主界面时不保存文本,但按下ElevatedButton时会保存文本,我是想不出办法才加进去测试的,初学者很难理解问题所在,提前感谢帮助。
import 'package:flutter/material.dart';
class BookRead extends StatefulWidget {
String nameScreen;
BookRead(this.nameScreen);
@override
State<BookRead> createState() => _BookReadState();}
class _BookReadState extends State<BookRead> {
final controllerT = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Center(
child: Text(widget.nameScreen),
),
),
body: Column(
children: [
Expanded(
child: TextField(
controller: controllerT,
maxLines: null,
expands: true,),),
ElevatedButton(onPressed: (){Navigator.push(context,
MaterialPageRoute(builder: (context) => AddTaskScreen()));}, child: Text('test'))],),);
}}
class AddTaskScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('test'),
),
body: Column(
children: [Expanded(child: Container())],),);
}}
3条答案
按热度按时间8fq7wneg1#
我认为你需要再次澄清这是如何与导航工作。
想象一下,你的应用程序中有3个页面:A、B和C。
您从页面A启动应用程序。页面A放置在堆栈中。现在您导航到页面B。页面B放置在堆栈中,因此A和B堆叠在堆栈中。现在您在文本字段中对页面B进行更改并导航到页面C。现在页面A,B和C都在堆栈中。如果您现在从页面C返回,它将从堆栈中删除所有更改,您将再次返回到页面B。由于页面B仍在堆栈中,因此您可以在文本字段中看到更改。如果您现在导航回页面A,则页面B将删除自身及其更改,因此,当您导航回页面B时,您将不再看到您的更改,因为状态已自行删除。
m1m5dgzv2#
TextField
在返回主屏幕时不保存文本的原因是BookRead
小部件是有状态小部件,并且当从AddTaskScreen
导航回小部件时,不会保留小部件的状态。当重新构建小部件时,其状态会重置,并且对小部件状态所做的任何更改都会丢失。但是,当按下
ElevatedButton
时,它会导航到一个新屏幕AddTaskScreen
,并且BookRead
小部件不会重建。因此,BookRead
小部件的状态会保留,并且TextField
的controllerT
属性继续保存用户输入的文本。为了在导航到
AddTaskScreen
和从AddTaskScreen
导航时保留BookRead
小部件的状态,我们需要使用一个保留小部件状态的导航方法,例如Navigator.pushReplacement
方法而不是Navigator.push
。当我们使用Navigator.pushReplacement
导航到AddTaskScreen
时,它会用新屏幕替换当前屏幕,当我们导航回BookRead
屏幕时,BookRead
小部件的状态仍然完好无损,TextField
继续保存用户输入的文本。下面是修改后的代码,它使用
Navigator.pushReplacement
导航到AddTaskScreen
并保留BookRead
小部件的状态:在修改后的代码中,
Navigator.pushReplacement
方法用于导航到AddTaskScreen
。当用户点击“测试”按钮时,BookRead
小部件被AddTaskScreen
替换,并且BookRead
小部件的状态被保留。当用户点击AddTaskScreen
中的“返回”按钮时,它导航回BookRead
屏幕,BookRead
窗口小部件的状态仍然保留,TextField
继续保存用户输入的文本。axr492tv3#
这些答案引导我找到正确的答案,阅读文档和正确的控制器实现