我正在开发一个Flutter 翼应用程序,需要有一个表格.因此,当用户打开应用程序时,表单前会出现一个闪屏,其中包含以下代码:

import 'package:flutter/material.dart';
import '../model/User.dart';
import './FileManager.dart';
import './MyListPage.dart';

class UserLoader extends StatefulWidget {
  @override
  _UserLoaderState createState() => new _UserLoaderState();
}

class _UserLoaderState extends State<UserLoader> {
  final userFileName = "user_infos.txt";
  User _user;

  @override
  Widget build(BuildContext context) {
    print("build UserLoader");
    final _formKey = new GlobalKey<FormState>();
    final _firstNameController = new TextEditingController();
    final _lastNameController = new TextEditingController();
    final _emailController = new TextEditingController();
    final _phoneController = new TextEditingController();

    return new Scaffold(
        appBar: new AppBar(
          title: new Text("Informations"),
          actions: <Widget>[
            new IconButton(
                icon: const Icon(Icons.save),
                onPressed: () {
                  _user = _onFormValidate(
                      _formKey.currentState,
                      _firstNameController.text,
                      _lastNameController.text,
                      _emailController.text,
                      _phoneController.text);
                })
          ],
        ),
        body: new Center(
          child: new SingleChildScrollView(
              child: new Form(
                  key: _formKey,
                  child: new Column(children: <Widget>[
                    new ListTile(
                      leading: const Icon(Icons.person),
                      title: new TextFormField(
                        decoration: new InputDecoration(
                          hintText: "Prénom",
                        ),
                        keyboardType: TextInputType.text,
                        controller: _firstNameController,
                        validator: _validateName,
                      ),
                    ),
                    new ListTile(
                      leading: const Icon(Icons.person),
                      title: new TextFormField(
                        decoration: new InputDecoration(
                          hintText: "Nom",
                        ),
                        keyboardType: TextInputType.text,
                        controller: _lastNameController,
                        validator: _validateName,
                      ),
                    ),
Etc, etc ...

但是,当我点击TextField时,键盘立即出现并关闭,所有组件都重新生成.所以我不可能填完这张表.

有没有人能有个解决方案?提前谢谢!

推荐答案

你还没有给我们完整的代码,所以我不知道上下文是什么.

我自己陷入的一个trap (根据您的描述,可能会影响您)是将一个有状态小部件嵌套在另一个有状态小部件中.

例如,

class Parent extends StatefulWidget {
  @override
  ParentState createState() => ParentState();
 
  (...)
}

class ParentState extends State<Parent> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Child(),
    );
  }

  (...)
}

class Child extends StatefulWidget {
  @override
  ChildState createState() => ChildState();
 
  (...)
}

class ChildState extends State<Child> {
  @override
  Widget build(BuildContext context) {
    return TextField(...);
  }

  (...)
}

这里的问题是,重建父对象意味着运行ParentState().build(),并创建一个new Child实例和一个新的ChildState对象.这会重置一切.

try 不要重新创建ChildWidget,而是将其保存在ParentState上,如下所示:

class Parent extends StatefulWidget {
  @override
  ParentState createState() => ParentState();
 
  (...)
}

class ParentState extends State<Parent> {
  Child _child;

  @override
  void initState() {
    _child = Child();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: _child,
    );
  }

  (...)
}
// The rest remains the same

编辑:您只需要记住,如果您的小部件树稍微复杂一些,您可能需要1)从父级传递一个回调来通知状态更改,2)不要忘记还对子部件调用setState().

Flutter相关问答推荐

如何在Flutter 屏幕中添加箭头形状

自动测试Flutter应用程序进行QA的最佳方法是什么?

Android Emulator冻结,但在调整窗口大小时解冻

Flutter版本3.19.2需要更新版本的Kotlin Gradle插件./android/build.gradle:ext.kotlin_version = latest-version>'

如何防止onTapCancel由子元素触发?

使用Future函数的容器中未显示图像,但在使用图像小工具时显示

为什么我的PUT请求不能正常工作?

如何让经过Firebase身份验证的用户能够将Zip文件上载到Firebase云存储?

如何管理枚举类型的阻塞事件?

将Riverpods NotifierProvider与State类一起使用

抖动问题:检测到0个或2个或更多具有相同值的[DropdownMenuItem]

Flutter在CustomPainter的右上角和左上角添加了2条曲线

Flutter http 请求获取 null

Flutter:使用不包含导航器的上下文请求导航器操作

Dart:未捕获错误:RangeError(索引):索引超出范围:索引应小于 7:7

splash_screen 没有被推送到登录页面

reactive_flutter_BLE - 应用找到设备但无法连接(并读取 BLE 数据)

Android Electric eel Mac M1:运行 flutter doctor -v 时无法找到Bundle 的 java 版本

如何制作两个显示相关内容且可编辑的文本字段?

我可以使用 Future 来填充Text() 小部件而不是在 Flutter 中使用 FutureBuilder 吗?