当前位置: 首页 > 知识库问答 >
问题:

Flutter:将新记录保存到列表时为什么要更新以前的记录

曾光誉
2023-03-14

我创建了一个表单,其中有四个用于用户输入数据的文本编辑字段和一个用于将数据保存到列表的按钮。

但当我将第二条记录添加到列表中时,第一条记录将自动更新,这是怎么回事。

IDE:VS Code flutter SDK版本:1.12.13+hotfix.8操作系统:windows 10

下面是我的代码:

import 'package:flutter/material.dart'; 

class GridPage extends StatelessWidget { 

  @override
  Widget build(BuildContext context) {
    List<TextEditingController> gControlers = [];
    List<FocusNode> _fNodes = [];
    List<Map> gridRecords = [];
    _fNodes.addAll(new List<FocusNode>.generate(4, (_) => new FocusNode()));
    gControlers.addAll(new List<TextEditingController>.generate(
        4, (_) => new TextEditingController()));

    final formKey = GlobalKey<FormState>();
    List<Map> rowset = [
      {"command": "X1", "columnID": "1", "value": ""},
      {"command": "X2", "columnID": "2", "value": ""},
      {"command": "X3", "columnID": "3", "value": ""},
      {"command": "X4", "columnID": "4", "value": ""}
    ];

    return Scaffold(
      appBar: AppBar(
        title: Text('Doc Detail'),
      ),
      body: Center(
        child: Form(
          key: formKey,
          child: Column(children: [
            Expanded(
              child: Container(
                height: 100.0,
                child: Column(children: [
                  Card(
                    elevation: 5.0,
                    child: ListTile(
                      title: TextFormField(
                        decoration: InputDecoration(
                          labelText: 'Item',
                        ),
                        keyboardType: TextInputType.text,
                        autocorrect: false,
                        textInputAction: TextInputAction.next,
                        focusNode: _fNodes[0],
                        controller: gControlers[0],
                        autofocus: true,
                        onFieldSubmitted: (value) {
                          FocusScope.of(context).requestFocus(_fNodes[1]);
                        },
                      ),
                    )
                  ),
                  Card(
                    elevation: 5.0,
                    child: ListTile(
                      title: TextFormField(
                        decoration: InputDecoration(
                          labelText: 'Lot',
                        ),
                        keyboardType: TextInputType.text,
                        autocorrect: false,
                        textInputAction: TextInputAction.next,
                        focusNode: _fNodes[1],
                        controller: gControlers[1],
                        autofocus: true,
                        onFieldSubmitted: (value) {
                          FocusScope.of(context).requestFocus(_fNodes[2]);
                        },
                      ),
                    )
                  ),
                  Card(
                    elevation: 5.0,
                    child: ListTile(
                      title: TextFormField(
                        decoration: InputDecoration(
                          labelText: 'Location',
                        ),
                        textInputAction: TextInputAction.next,
                        focusNode: _fNodes[2],
                        controller: gControlers[2],
                        autofocus: true,
                        onFieldSubmitted: (value) {
                          FocusScope.of(context).requestFocus(_fNodes[3]);
                        },
                      ),
                    )
                  ),
                  Card(
                    elevation: 5.0,
                    child: ListTile(
                      title: TextFormField(
                        decoration: InputDecoration(
                          labelText: 'QTY',
                        ),
                        keyboardType: TextInputType.number,
                        autocorrect: false,
                        textInputAction: TextInputAction.next,
                        focusNode: _fNodes[3],
                        controller: gControlers[3],
                        autofocus: true,
                        onFieldSubmitted: (value) {
                          FocusScope.of(context).requestFocus(_fNodes[0]);
                        },
                      ),
                    )
                  ),
                ]),
              )
            ),
            RaisedButton(
              child: Text('New'),
              onPressed: () {
                int len = gridRecords.length;
                var t1 = getTextToRecord(rowset, len ?? 0,gControlers);
                gridRecords.add(t1);
                FocusScope.of(context).requestFocus(_fNodes[0]);
              }
            )
          ])
        )
      )
    );
  }

  Map getTextToRecord(List<Map> rowset, int length,List gControlers) {
    int x = 0;
    rowset.forEach((f) {
      f["value"] = gControlers[x].text;
      x = x+1;
    });

    Map _g1 = {};
    _g1["line"] = length + 1;
    _g1["valueMap"] = rowset;
    return _g1;
  }
}

列表中的所有记录将根据上次输入的数据自动更新,请给予帮助,谢谢。

共有1个答案

龙嘉玉
2023-03-14

请尝试下面的代码并检查输出

class GridPage extends StatefulWidget {
  @override
  _GridPageState createState() => _GridPageState();
}

class _GridPageState extends State<GridPage> {
  List<Map> gridRecords = [];
  List<TextEditingController> gControlers = [];
  List<FocusNode> _fNodes = [];
  final formKey = GlobalKey<FormState>();

  @override
  void initState() {
    super.initState();
    _fNodes.addAll(new List<FocusNode>.generate(4, (_) => new FocusNode()));
    gControlers.addAll(new List<TextEditingController>.generate(
        4, (_) => new TextEditingController()));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Doc Detail'),
        ),
        body: Center(
            child: Form(
                key: formKey,
                child: Column(children: [
                  Flexible(
                      child: ListView(children: [
                    Card(
                        elevation: 5.0,
                        child: ListTile(
                          title: TextFormField(
                            decoration: InputDecoration(
                              labelText: 'Item',
                            ),
                            keyboardType: TextInputType.text,
                            autocorrect: false,
                            textInputAction: TextInputAction.next,
                            focusNode: _fNodes[0],
                            controller: gControlers[0],
                            autofocus: true,
                            onFieldSubmitted: (value) {
                              FocusScope.of(context).requestFocus(_fNodes[1]);
                            },
                          ),
                        )),
                    Card(
                        elevation: 5.0,
                        child: ListTile(
                          title: TextFormField(
                            decoration: InputDecoration(
                              labelText: 'Lot',
                            ),
                            keyboardType: TextInputType.text,
                            autocorrect: false,
                            textInputAction: TextInputAction.next,
                            focusNode: _fNodes[1],
                            controller: gControlers[1],
                            autofocus: true,
                            onFieldSubmitted: (value) {
                              FocusScope.of(context).requestFocus(_fNodes[2]);
                            },
                          ),
                        )),
                    Card(
                        elevation: 5.0,
                        child: ListTile(
                          title: TextFormField(
                            decoration: InputDecoration(
                              labelText: 'Location',
                            ),
                            textInputAction: TextInputAction.next,
                            focusNode: _fNodes[2],
                            controller: gControlers[2],
                            autofocus: true,
                            onFieldSubmitted: (value) {
                              FocusScope.of(context).requestFocus(_fNodes[3]);
                            },
                          ),
                        )),
                    Card(
                        elevation: 5.0,
                        child: ListTile(
                          title: TextFormField(
                            decoration: InputDecoration(
                              labelText: 'QTY',
                            ),
                            keyboardType: TextInputType.number,
                            autocorrect: false,
                            textInputAction: TextInputAction.next,
                            focusNode: _fNodes[3],
                            controller: gControlers[3],
                            autofocus: true,
                            onFieldSubmitted: (value) {
                              FocusScope.of(context).requestFocus(_fNodes[0]);
                            },
                          ),
                        )),
                  ])),
                  RaisedButton(
                    child: Text('New'),
                    onPressed: () {
                      for (int i = 0; i < 4; i++) {
                        Map _g1 = Map();
                        _g1["line"] = i + 1;
                        _g1["valueMap"] = {
                          "command": 'X' + (i + 1).toString(),
                          "columnID": i + 1,
                          "value": gControlers[i].text
                        };
                        gridRecords.add(_g1);
                        gControlers[i].clear();
                      }
                      FocusScope.of(context).requestFocus(_fNodes[0]);
                      print("size of list" + gridRecords.toString());
                    },
                  )
                ]))));
  }
}
 类似资料:
  • 我有一个由3列组成的用户设置表(或见下图):,,。 然后我有两个函数,一个保存时区,一个保存时间格式。 当我第一次运行函数时(每个函数都是通过ajax调用独立运行的),我得到了正确的结果: 然后,当我尝试更新

  • 更新记录 V2.0.0 加入寄存器运行模式,可大幅提升热更内数值计算性能 执行性能整体提升,传统非寄存器模式执行效率也得到一定幅度提升 修正热更内finnaly块在一些情况下不正确的bug,连带修复了yield return和async/await的一些异常情况 修正值对类型绑定后的数组进行操作时的异常 修正热更内Enum一些情况下Equals结果错误的bug 修正跨域继承接口时的一些异常情况 修

  •  版本更新记录 2016.09.10 1) 底层组件-新增时间处理集合 2016.09.5 1) 底层组件-优化防刷 2) 底层组件-错误监控 2) 底层组件-优化通过类名绑定相关事件 2016.08.25 1) 底层组件-新增百度统计组件 2016.08.11 1) 底层组件-优化udb定制登录,增加QQ登录 2) 活动组件-新增完成任务组件 2016.08.9 1) 活动组件-新增防刷组件

  • 我们有一个名为的实体,它与实体有OneToOne关系。

  • 更新记录命令用于修改特定记录的值。 是更新特定字段值的基本命令。 以下语句是命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 定义要更新的字段。 - 将指定的字段值增加给定的值。 - 在收集字段中添加新项目。 - 从收集字段中移除一个项目。 - 在地图字段中输入条目。 - 用JSON文档内容替换记录内容。 - 将记录内容与JSON文档合并。 - 指定如何锁定加载和更新之间的记录。有两个选

  • 1.2到1.3的变化 功能新增 创建应用新增功能 新增日志设置,可以把对日志的各个输出源进行开关设置。 应用的日志新增输出到fds的功能,可以把应用日志导入到生态链公司自己的dfs中 一个应用现在可以设置多个内部服务端口,应用支持多端口了 提供HTTPS的外部服务时,可以设置白名单限制IP访问 提供HTTPS的外部服务时,增加accesslog选项,可以选择收集该域名的acccesslog日志到s