dart 返回主屏幕时,TextField不会保存文本

i86rm4rw  于 2023-04-27  发布在  其他
关注(0)|答案(3)|浏览(134)

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())],),);
  }}
8fq7wneg

8fq7wneg1#

我认为你需要再次澄清这是如何与导航工作。
想象一下,你的应用程序中有3个页面:A、B和C。
您从页面A启动应用程序。页面A放置在堆栈中。现在您导航到页面B。页面B放置在堆栈中,因此A和B堆叠在堆栈中。现在您在文本字段中对页面B进行更改并导航到页面C。现在页面A,B和C都在堆栈中。如果您现在从页面C返回,它将从堆栈中删除所有更改,您将再次返回到页面B。由于页面B仍在堆栈中,因此您可以在文本字段中看到更改。如果您现在导航回页面A,则页面B将删除自身及其更改,因此,当您导航回页面B时,您将不再看到您的更改,因为状态已自行删除。

m1m5dgzv

m1m5dgzv2#

TextField在返回主屏幕时不保存文本的原因是BookRead小部件是有状态小部件,并且当从AddTaskScreen导航回小部件时,不会保留小部件的状态。当重新构建小部件时,其状态会重置,并且对小部件状态所做的任何更改都会丢失。
但是,当按下ElevatedButton时,它会导航到一个新屏幕AddTaskScreen,并且BookRead小部件不会重建。因此,BookRead小部件的状态会保留,并且TextFieldcontrollerT属性继续保存用户输入的文本。
为了在导航到AddTaskScreen和从AddTaskScreen导航时保留BookRead小部件的状态,我们需要使用一个保留小部件状态的导航方法,例如Navigator.pushReplacement方法而不是Navigator.push。当我们使用Navigator.pushReplacement导航到AddTaskScreen时,它会用新屏幕替换当前屏幕,当我们导航回BookRead屏幕时,BookRead小部件的状态仍然完好无损,TextField继续保存用户输入的文本。
下面是修改后的代码,它使用Navigator.pushReplacement导航到AddTaskScreen并保留BookRead小部件的状态:

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.pushReplacement(
                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(),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.pop(context);
            },
            child: Text('Go back'),
          ),
        ],
      ),
    );
  }
}

在修改后的代码中,Navigator.pushReplacement方法用于导航到AddTaskScreen。当用户点击“测试”按钮时,BookRead小部件被AddTaskScreen替换,并且BookRead小部件的状态被保留。当用户点击AddTaskScreen中的“返回”按钮时,它导航回BookRead屏幕,BookRead窗口小部件的状态仍然保留,TextField继续保存用户输入的文本。

axr492tv

axr492tv3#

这些答案引导我找到正确的答案,阅读文档和正确的控制器实现

import 'package:flutter/material.dart';
class BookRead extends StatefulWidget {
 String nameScreen;
 BookRead(this.nameScreen);  

@override
State<BookRead> createState() => _BookReadState();}

class _BookReadState extends State<BookRead> {

late TextEditingController controllerT;  
static String texts = '';                 

@override
 void initState() {
  controllerT = TextEditingController();
  controllerT.text = texts;  
 super.initState();}

@override            
 void dispose() {
  controllerT.dispose();
 super.dispose();}

@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,
          onChanged: (value){           
            texts = value;},),),

相关问题