Flutter 颤振:如何从点击编辑按钮的列表数据填充表单并保存它?

Flutter 颤振:如何从点击编辑按钮的列表数据填充表单并保存它?,flutter,listview,dart,Flutter,Listview,Dart,我有一个列表,刚开始时是硬编码的。当我在表单中输入时,表单数据保存到列表中。当我点击更新图标时,我想以相同索引的形式获取数据。当前屏幕如下所示 我想在点击编辑按钮后得到这个输出。我有什么办法可以做到这一点吗 这是我的密码 import 'package:flutter/material.dart'; import 'package:table/model.dart'; class Episode5 extends StatefulWidget { @override _Episod

我有一个列表,刚开始时是硬编码的。当我在表单中输入时,表单数据保存到列表中。当我点击更新图标时,我想以相同索引的形式获取数据。当前屏幕如下所示

我想在点击编辑按钮后得到这个输出。我有什么办法可以做到这一点吗

这是我的密码

import 'package:flutter/material.dart';
import 'package:table/model.dart';

class Episode5 extends StatefulWidget {
  @override
  _Episode5State createState() => _Episode5State();
}

class _Episode5State extends State<Episode5> {
  TextEditingController nameController = TextEditingController();
  TextEditingController emailController = TextEditingController();

  final form = GlobalKey<FormState>();
  static var _focusNode = new FocusNode();
  User user = User();
  List<User> userList = [
    User(name: "a", email: "a"),
    User(name: "d", email: "b"),
    User(name: "c", email: "c")
  ];

  @override
  Widget build(BuildContext context) {
    Widget bodyData() => DataTable(
          onSelectAll: (b) {},
          sortColumnIndex: 0,
          sortAscending: true,
          columns: <DataColumn>[
            DataColumn(
                label: Text("Name"),
                numeric: false,
                tooltip: "To Display name"),
            DataColumn(
                label: Text("Email"),
                numeric: false,
                tooltip: "To Display Email"),
            DataColumn(
                label: Text("Update"),
                numeric: false,
                tooltip: "To Display Email"),
          ],
          rows: userList
              .map(
                (name) => DataRow(
                  cells: [
                    DataCell(
                      Text(name.name),
                    ),
                    DataCell(
                      Text(name.email),
                    ),
                    DataCell(
                      Icon(
                        Icons.edit,
                        color: Colors.black,
                      ),
                    ),
                  ],
                ),
              )
              .toList(),
        );

    return Scaffold(
      appBar: AppBar(
        title: Text("Data add to List Table using Form"),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            bodyData(),
            Padding(
              padding: EdgeInsets.all(10.0),
              child: Form(
                key: form,
                child: Container(
                  child: Column(
                    children: <Widget>[
                      TextFormField(
                        controller: nameController,
                        focusNode: _focusNode,
                        keyboardType: TextInputType.text,
                        autocorrect: false,
                        onSaved: (String value) {
                          user.name = value;
                        },
                        maxLines: 1,
                        validator: (value) {
                          if (value.isEmpty) {
                            return 'This field is required';
                          }
                          return null;
                        },
                        decoration: new InputDecoration(
                          labelText: 'Name',
                          hintText: 'Name',
                          labelStyle: new TextStyle(
                              decorationStyle: TextDecorationStyle.solid),
                        ),
                      ),
                      SizedBox(
                        height: 10,
                      ),
                      TextFormField(
                        controller: emailController,
                        keyboardType: TextInputType.text,
                        autocorrect: false,
                        maxLines: 1,
                        validator: (value) {
                          if (value.isEmpty) {
                            return 'This field is required';
                          }
                          return null;
                        },
                        onSaved: (String value) {
                          user.email = value;
                        },
                        decoration: new InputDecoration(
                            labelText: 'Email',
                            hintText: 'Email',
                            labelStyle: new TextStyle(
                                decorationStyle: TextDecorationStyle.solid)),
                      ),
                      SizedBox(
                        height: 10,
                      ),
                      Column(
                        // crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Center(
                            child: Row(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: <Widget>[
                                TextButton(
                                  child: Text("Add"),
                                  onPressed: () {
                                    if (validate() == true) {
                                      form.currentState.save();
                                      addUserToList(
                                        user.name,
                                        user.email,
                                      );
                                      clearForm();
                                    }
                                  },
                                ),
                              ],
                            ),
                          ),
                        ],
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  void addUserToList(name, email) {
    userList.add(User(name: name, email: email));
  }

  clearForm() {
    nameController.clear();
    emailController.clear();
  }

  bool validate() {
    var valid = form.currentState.validate();
    if (valid) form.currentState.save();
    return valid;
  }
}
导入“包装:颤振/材料.省道”;
导入“package:table/model.dart”;
类eposode5扩展了StatefulWidget{
@凌驾
_Episode5State createState()=>_Episode5State();
}
类_eposode5state扩展状态{
TextEditingController name控制器=TextEditingController();
TextEditingController emailController=TextEditingController();
最终形式=GlobalKey();
静态变量_focusNode=新的focusNode();
User=User();
列表用户列表=[
用户(姓名:“a”,电子邮件:“a”),
用户(姓名:“d”,电子邮件:“b”),
用户(姓名:“c”,电子邮件:“c”)
];
@凌驾
小部件构建(构建上下文){
Widget bodyData()=>DataTable(
选举:(b){},
sortColumnIndex:0,
排序:是的,
栏目:[
数据列(
标签:文本(“名称”),
数字:false,
工具提示:“显示名称”),
数据列(
标签:文本(“电子邮件”),
数字:false,
工具提示:“显示电子邮件”),
数据列(
标签:文本(“更新”),
数字:false,
工具提示:“显示电子邮件”),
],
行:用户列表
.地图(
(名称)=>DataRow(
单元格:[
数据单元(
文本(name.name),
),
数据单元(
文本(姓名、电子邮件),
),
数据单元(
图标(
图标。编辑,
颜色:颜色,黑色,
),
),
],
),
)
.toList(),
);
返回脚手架(
appBar:appBar(
标题:文本(“使用表格将数据添加到列表中”),
),
主体:容器(
子:列(
儿童:[
bodyData(),
填充物(
填充:所有边缘设置(10.0),
孩子:表格(
关键:形式,
子:容器(
子:列(
儿童:[
TextFormField(
控制器:名称控制器,
focusNode:_focusNode,
键盘类型:TextInputType.text,
自动更正:错误,
onSaved:(字符串值){
user.name=值;
},
maxLines:1,
验证器:(值){
if(value.isEmpty){
返回“此字段为必填字段”;
}
返回null;
},
装饰:新的输入装饰(
labelText:'名称',
hintText:'名称',
标签样式:新的文本样式(
装饰样式:TextDecorationStyle.solid),
),
),
大小盒子(
身高:10,
),
TextFormField(
控制器:emailController,
键盘类型:TextInputType.text,
自动更正:错误,
maxLines:1,
验证器:(值){
if(value.isEmpty){
返回“此字段为必填字段”;
}
返回null;
},
onSaved:(字符串值){
user.email=值;
},
装饰:新的输入装饰(
labelText:“电子邮件”,
hintText:“电子邮件”,
标签样式:新的文本样式(
装饰样式:TextDecorationStyle.solid),
),
大小盒子(
身高:10,
),
纵队(
//crossAxisAlignment:crossAxisAlignment.start,
儿童:[
居中(
孩子:排(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
文本按钮(
子项:文本(“添加”),
已按下:(){
如果(validate()==true){
form.currentState.save();
addUserToList(
user.name,
user.email,
);
clearForm();
}
},
),
],
),
),
],
),
],
),
),
),
),
],
),
),
);
}
void addUserToList(姓名、电子邮件){
尤里斯
void _updateTextControllers(User user) {
    setState(() {
      nameController.text = user.name;
      emailController.text = user.email;
    });
  }
rows: userList
              .map(
                (name) => DataRow(
                  cells: [
                    DataCell(
                      Text(name.name),
                    ),
                    DataCell(
                      Text(name.email),
                    ),
                    DataCell(
                      IconButton(
                        onPressed: () => _updateTextControllers(name), // new function here
                        icon: Icon(
                          Icons.edit,
                          color: Colors.black,
                        ),
                      ),
                    ),
                  ],
                ),
              )
              .toList(),