Flutter 颤振:即使在来回切换屏幕后,如何将列表数据保存在表中?

Flutter 颤振:即使在来回切换屏幕后,如何将列表数据保存在表中?,flutter,listview,dart,Flutter,Listview,Dart,我有一个用于CRUD的表单(第二个屏幕)。当我添加数据时,它会保存到列表视图中,如表中所示 列表视图被传递到(第一个屏幕),在那里我可以迭代并查看包含更新内容的列表数据 但是,当我单击转到第二个屏幕时,列表视图数据消失。给出的3个列表是硬编码的,用于测试目的 现在,我的问题是,即使我来回多次更改屏幕,我如何保持表中的数据不消失。我的代码如下:- ** Main.dart文件 ** 3。第5集文件 class Episode5 extends StatefulWidget { @over

我有一个用于CRUD的表单(第二个屏幕)。当我添加数据时,它会保存到列表视图中,如表中所示

列表视图被传递到(第一个屏幕),在那里我可以迭代并查看包含更新内容的列表数据

但是,当我单击转到第二个屏幕时,列表视图数据消失。给出的3个列表是硬编码的,用于测试目的

现在,我的问题是,即使我来回多次更改屏幕,我如何保持表中的数据不消失。我的代码如下:-

**

  • Main.dart文件
  • **

    3。第5集文件

    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();
      bool update = false;
      int currentIndex = 0;
    
      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"), tooltip: "To Display name"),
                DataColumn(label: Text("Email"), tooltip: "To Display Email"),
                DataColumn(label: Text("Update"), tooltip: "Update data"),
              ],
              rows: userList
                  .map(
                    (user) => DataRow(
                      cells: [
                        DataCell(
                          Text(user.name),
                        ),
                        DataCell(
                          Text(user.email),
                        ),
                        DataCell(
                          IconButton(
                            onPressed: () {
                              currentIndex = userList.indexOf(user);
                              _updateTextControllers(user); // new function here
                            },
                            icon: 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,
                            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;
                            },
                            decoration: new InputDecoration(
                                labelText: 'Email',
                                hintText: 'Email',
                                labelStyle: new TextStyle(
                                    decorationStyle: TextDecorationStyle.solid)),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          Column(
                            children: <Widget>[
                              Center(
                                child: Row(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      children: <Widget>[
                                        TextButton(
                                          child: Text("Add"),
                                          onPressed: () {
                                            form.currentState.save();
                                            addUserToList(
                                              nameController.text,
                                              emailController.text,
                                            );
                                          },
                                        ),
                                        TextButton(
                                          child: Text("Update"),
                                          onPressed: () {
                                            form.currentState.save();
                                            updateForm();
                                          },
                                        ),
                                      ],
                                    ),
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.end,
                                      mainAxisAlignment: MainAxisAlignment.end,
                                      children: <Widget>[
                                        ElevatedButton(
                                          child: Text("Save and Exit"),
                                          onPressed: () {
                                            form.currentState.save();
                                            addUserToList(
                                              nameController.text,
                                              emailController.text,
                                            );
                                            Navigator.pop(context, userList);
                                          },
                                        ),
                                      ],
                                    ),
                                  ],
                                ),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
      void updateForm() {
        setState(() {
          User user = User(name: nameController.text, email: emailController.text);
          userList[currentIndex] = user;
        });
      }
    
      void _updateTextControllers(User user) {
        setState(() {
          nameController.text = user.name;
          emailController.text = user.email;
        });
      }
    
      void addUserToList(name, email) {
        setState(() {
          userList.add(User(name: name, email: email));
        });
      }
    }
    
    class eposode5扩展了StatefulWidget{
    @凌驾
    _Episode5State createState()=>_Episode5State();
    }
    类_eposode5state扩展状态{
    TextEditingController name控制器=TextEditingController();
    TextEditingController emailController=TextEditingController();
    最终形式=GlobalKey();
    静态变量_focusNode=新的focusNode();
    bool update=false;
    int currentIndex=0;
    列表用户列表=[
    用户(姓名:“a”,电子邮件:“a”),
    用户(姓名:“d”,电子邮件:“b”),
    用户(姓名:“c”,电子邮件:“c”),
    ];
    @凌驾
    小部件构建(构建上下文){
    Widget bodyData()=>DataTable(
    选举:(b){},
    sortColumnIndex:0,
    排序:是的,
    栏目:[
    DataColumn(标签:文本(“名称”),工具提示:“显示名称”),
    DataColumn(标签:文本(“电子邮件”),工具提示:“显示电子邮件”),
    DataColumn(标签:文本(“更新”),工具提示:“更新数据”),
    ],
    行:用户列表
    .地图(
    (用户)=>DataRow(
    单元格:[
    数据单元(
    文本(用户名),
    ),
    数据单元(
    文本(user.email),
    ),
    数据单元(
    图标按钮(
    已按下:(){
    currentIndex=userList.indexOf(用户);
    _UpdateTextController(用户);//此处有新函数
    },
    图标:图标(
    图标。编辑,
    颜色:颜色,黑色,
    ),
    ),
    ),
    ],
    ),
    )
    .toList(),
    );
    返回脚手架(
    appBar:appBar(
    标题:文本(“使用表格将数据添加到列表中”),
    ),
    主体:容器(
    子:列(
    儿童:[
    bodyData(),
    填充物(
    填充:所有边缘设置(10.0),
    孩子:表格(
    关键:形式,
    子:容器(
    子:列(
    儿童:[
    TextFormField(
    控制器:名称控制器,
    focusNode:_focusNode,
    键盘类型:TextInputType.text,
    自动更正:错误,
    maxLines:1,
    验证器:(值){
    if(value.isEmpty){
    返回“此字段为必填字段”;
    }
    返回null;
    },
    装饰:新的输入装饰(
    labelText:'名称',
    hintText:'名称',
    标签样式:新的文本样式(
    装饰样式:TextDecorationStyle.solid),
    ),
    ),
    大小盒子(
    身高:10,
    ),
    TextFormField(
    控制器:emailController,
    键盘类型:TextInputType.text,
    自动更正:错误,
    maxLines:1,
    验证器:(值){
    if(value.isEmpty){
    返回“此字段为必填字段”;
    }
    返回null;
    },
    装饰:新的输入装饰(
    labelText:“电子邮件”,
    hintText:“电子邮件”,
    标签样式:新的文本样式(
    装饰样式:TextDecorationStyle.solid),
    ),
    大小盒子(
    身高:10,
    ),
    纵队(
    儿童:[
    居中(
    孩子:排(
    crossAxisAlignment:crossAxisAlignment.start,
    儿童:[
    划船(
    crossAxisAlignment:crossAxisAlignment.start,
    儿童:[
    文本按钮(
    子项:文本(“添加”),
    已按下:(){
    form.currentState.save();
    addUserToList(
    nameController.text,
    emailController.text,
    );
    },
    ),
    文本按钮(
    子项:文本(“更新”),
    已按下:(){
    form.currentState.save();
    
    class User {
      String name;
      String email;
    
      User({this.name, this.email});
    }
    
    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();
      bool update = false;
      int currentIndex = 0;
    
      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"), tooltip: "To Display name"),
                DataColumn(label: Text("Email"), tooltip: "To Display Email"),
                DataColumn(label: Text("Update"), tooltip: "Update data"),
              ],
              rows: userList
                  .map(
                    (user) => DataRow(
                      cells: [
                        DataCell(
                          Text(user.name),
                        ),
                        DataCell(
                          Text(user.email),
                        ),
                        DataCell(
                          IconButton(
                            onPressed: () {
                              currentIndex = userList.indexOf(user);
                              _updateTextControllers(user); // new function here
                            },
                            icon: 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,
                            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;
                            },
                            decoration: new InputDecoration(
                                labelText: 'Email',
                                hintText: 'Email',
                                labelStyle: new TextStyle(
                                    decorationStyle: TextDecorationStyle.solid)),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          Column(
                            children: <Widget>[
                              Center(
                                child: Row(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      children: <Widget>[
                                        TextButton(
                                          child: Text("Add"),
                                          onPressed: () {
                                            form.currentState.save();
                                            addUserToList(
                                              nameController.text,
                                              emailController.text,
                                            );
                                          },
                                        ),
                                        TextButton(
                                          child: Text("Update"),
                                          onPressed: () {
                                            form.currentState.save();
                                            updateForm();
                                          },
                                        ),
                                      ],
                                    ),
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.end,
                                      mainAxisAlignment: MainAxisAlignment.end,
                                      children: <Widget>[
                                        ElevatedButton(
                                          child: Text("Save and Exit"),
                                          onPressed: () {
                                            form.currentState.save();
                                            addUserToList(
                                              nameController.text,
                                              emailController.text,
                                            );
                                            Navigator.pop(context, userList);
                                          },
                                        ),
                                      ],
                                    ),
                                  ],
                                ),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
      void updateForm() {
        setState(() {
          User user = User(name: nameController.text, email: emailController.text);
          userList[currentIndex] = user;
        });
      }
    
      void _updateTextControllers(User user) {
        setState(() {
          nameController.text = user.name;
          emailController.text = user.email;
        });
      }
    
      void addUserToList(name, email) {
        setState(() {
          userList.add(User(name: name, email: email));
        });
      }
    }
    
    class FormController extends GetxController {
      TextEditingController nameController = TextEditingController();
      TextEditingController emailController = TextEditingController();
      int currentIndex = 0;
    
      List<User> userList = [
        User(name: "a", email: "a"),
        User(name: "d", email: "b"),
        User(name: "c", email: "c"),
      ];
    
      void updateForm() {
        User user = User(name: nameController.text, email: emailController.text);
        userList[currentIndex] = user;
        update();
      }
    
      void updateTextControllers(User user) {
        nameController.text = user.name;
        emailController.text = user.email;
        update();
      }
    
      void addUserToList(name, email) {
        userList.add(User(name: name, email: email));
        update();
      }
    
      void updateLanguageInformation() {
        // for (var i = 0; i <= userList.length; i++) { // ** don't need nested for loop here **
        for (var user in userList) {
          print("Name: " + user.name + " Email: " + user.email);
        }
        // }
      }
    }
    
    void main() {
      Get.put(FormController()); // controller init
      runApp(MyApp());
    }
    
    class Episode5 extends StatefulWidget {
      @override
      _Episode5State createState() => _Episode5State();
    }
    
    class _Episode5State extends State<Episode5> {
      final form = GlobalKey<FormState>();
      static var _focusNode = new FocusNode();
      // finding same instance if initialized controller
      final controller = Get.find<FormController>();
      @override
      Widget build(BuildContext context) {
        Widget bodyData() => DataTable(
              onSelectAll: (b) {},
              sortColumnIndex: 0,
              sortAscending: true,
              columns: <DataColumn>[
                DataColumn(label: Text("Name"), tooltip: "To Display name"),
                DataColumn(label: Text("Email"), tooltip: "To Display Email"),
                DataColumn(label: Text("Update"), tooltip: "Update data"),
              ],
              rows: controller.userList // accessing list from Getx controller
                  .map(
                    (user) => DataRow(
                      cells: [
                        DataCell(
                          Text(user.name),
                        ),
                        DataCell(
                          Text(user.email),
                        ),
                        DataCell(
                          IconButton(
                            onPressed: () {
                              controller.currentIndex =
                                  controller.userList.indexOf(user);
                              controller.updateTextControllers(user);
                            },
                            icon: 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>[
                // GetBuilder rebuilds when update() is called
                GetBuilder<FormController>(
                  builder: (controller) => bodyData(),
                ),
                Padding(
                  padding: EdgeInsets.all(10.0),
                  child: Form(
                    key: form,
                    child: Container(
                      child: Column(
                        children: <Widget>[
                          TextFormField(
                            controller: controller.nameController,
                            focusNode: _focusNode,
                            keyboardType: TextInputType.text,
                            autocorrect: false,
                            maxLines: 1,
                            validator: (value) {
                              if (value.isEmpty) {
                                return 'This field is required';
                              }
                              return null;
                            },
                            decoration: InputDecoration(
                              labelText: 'Name',
                              hintText: 'Name',
                              labelStyle: new TextStyle(
                                  decorationStyle: TextDecorationStyle.solid),
                            ),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          TextFormField(
                            controller: controller.emailController,
                            keyboardType: TextInputType.text,
                            autocorrect: false,
                            maxLines: 1,
                            validator: (value) {
                              if (value.isEmpty) {
                                return 'This field is required';
                              }
                              return null;
                            },
                            decoration: InputDecoration(
                                labelText: 'Email',
                                hintText: 'Email',
                                labelStyle: new TextStyle(
                                    decorationStyle: TextDecorationStyle.solid)),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          Column(
                            children: <Widget>[
                              Center(
                                child: Row(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      children: <Widget>[
                                        TextButton(
                                          child: Text("Add"),
                                          onPressed: () {
                                            form.currentState.save();
                                            controller.addUserToList(
                                              controller.nameController.text,
                                              controller.emailController.text,
                                            );
                                          },
                                        ),
                                        TextButton(
                                          child: Text("Update"),
                                          onPressed: () {
                                            form.currentState.save();
                                            controller.updateForm();
                                          },
                                        ),
                                      ],
                                    ),
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.end,
                                      mainAxisAlignment: MainAxisAlignment.end,
                                      children: <Widget>[
                                        ElevatedButton(
                                          child: Text("Save and Exit"),
                                          onPressed: () {
                                            form.currentState.save();
                                            controller.updateLanguageInformation(); // all this function does is print the list
                                            Navigator.pop(
                                                context); // don't need to pass anything here
                                          },
                                        ),
                                      ],
                                    ),
                                  ],
                                ),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Testing List View Data From second page to first page"),
          ),
          body: Column(
            children: <Widget>[
              Expanded(
                child: GetBuilder<FormController>(
                  builder: (controller) => ListView.builder(
                    itemCount: controller.userList.length,
                    itemBuilder: (context, index) => Row(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: [
                        Text(controller.userList[index].name),
                        Text(controller.userList[index].email),
                      ],
                    ),
                  ),
                ),
              ),
              SizedBox(
                height: 10.0,
              ),
              ElevatedButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => Episode5(),
                    ),
                  );
                },
                child: Text("Go to Form"),
              ),
            ],
          ),
        );
      }
    }