Json 颤振:当列表数据更改时,getx控制器未更新。我如何确保添加了每个列表后,GetX控制器都知道这一点?

Json 颤振:当列表数据更改时,getx控制器未更新。我如何确保添加了每个列表后,GetX控制器都知道这一点?,json,flutter,listview,controller,getx,Json,Flutter,Listview,Controller,Getx,我只是在stepper中有一个表单,有两个字段名称和电子邮件。“添加”按钮工作正常,并按预期将姓名和电子邮件添加到列表中。当我单击save时,JSON数据与列表中的所有可用数据一起打印 但是,当我点击底部的save按钮时,硬编码列表被打印出来,而不是我们输入的数据 输出如下。我想获取JSON中的所有列表数据。当前,以下列表中没有手动插入的数据: {"User Data":[{"Name":"first language","

我只是在stepper中有一个表单,有两个字段名称和电子邮件。“添加”按钮工作正常,并按预期将姓名和电子邮件添加到列表中。当我单击save时,JSON数据与列表中的所有可用数据一起打印

但是,当我点击底部的save按钮时,硬编码列表被打印出来,而不是我们输入的数据

输出如下。我想获取JSON中的所有列表数据。当前,以下列表中没有手动插入的数据:

{"User Data":[{"Name":"first language","Email":"first value"},{"Name":"second language","Email":"second value"},{"Name":"third language","Email":"third value"}]}
代码如下:-

  • 省道模型
  • 类用户{
    字符串名;
    字符串电子邮件;
    用户({this.name,this.email});
    映射到JSON()=>{
    “名称”:名称,
    “电子邮件”:电子邮件,
    };
    }
    JSONGenerate类{
    列出用户数据;
    JSONGenerate([this.userData]);
    映射到JSON(){
    List userData=this.userData!=null
    ?this.userData.map((i)=>i.toJson()).toList()
    :null;
    返回{
    “用户数据”:用户数据,
    };
    }
    } 
    
  • User.dart
  • 类UserMinor扩展StatefulWidget{ @凌驾 _UserMinorState createState(); } 类_UserMinorState扩展状态{ 最终形式=GlobalKey(); 静态变量_focusNode=新的focusNode(); //如果初始化了控制器,则查找相同的实例 最终控制器=Get.find(); @凌驾 小部件构建(构建上下文){ Widget bodyData()=>DataTable( 选举:(b){}, sortColumnIndex:0, 排序:是的, 栏目:[ DataColumn(标签:文本(“用户名”),工具提示:“用户名”), DataColumn(标签:文本(“用户电子邮件”),工具提示:“用户电子邮件”), ], 行:controller.userList//从Getx控制器访问列表 .地图( (用户)=>DataRow( 单元格:[ 数据单元( 文本(用户名), ), 数据单元( 文本(user.email), ), ], ), ) .toList(), ); 返回填充( 填充:所有边缘设置(10.0), 子:列( 儿童:[ 填充物( 填充:所有边缘设置(10.0), 孩子:表格( 关键:形式, 子:容器( 子:列( 儿童:[ TextFormField( 控制器:controller.nameController, focusNode:_focusNode, 键盘类型:TextInputType.text, 自动更正:错误, maxLines:1, 验证器:(值){ if(value.isEmpty){ 返回“此字段为必填字段”; } 返回null; }, 装饰:输入装饰( labelText:'名称', hintText:'名称', 标签样式:新的文本样式( 装饰样式:TextDecorationStyle.solid), ), ), 大小盒子( 身高:10, ), TextFormField( 控制器:controller.emailController, 键盘类型:TextInputType.text, 自动更正:错误, maxLines:1, 验证器:(值){ if(value.isEmpty){ 返回“此字段为必填字段”; } 返回null; }, 装饰:输入装饰( labelText:“电子邮件”, hintText:“电子邮件”, 标签样式:新的文本样式( 装饰样式:TextDecorationStyle.solid), ), 大小盒子( 身高:10, ), 纵队( 儿童:[ 居中( 孩子:排( crossAxisAlignment:crossAxisAlignment.start, 儿童:[ 划船( crossAxisAlignment:crossAxisAlignment.start, 儿童:[ 文本按钮( 子项:文本(“添加”), 已按下:(){ 如果(validate()==true){ form.currentState.save(); controller.addLanguagetoList( controller.nameController.text, controller.emailController.text, ); } }, ), 升降按钮( 子项:文本(“保存”), 已按下:(){ form.currentState.save(); 字符串minorlanguageListJson= jsonEncode(controller.userList); 打印(minorlanguageListJson); }), ], ),
    {"User Data":[{"Name":"first language","Email":"first value"},{"Name":"second language","Email":"second value"},{"Name":"third language","Email":"third value"}]}
    
        class User {
          String name;
          String email;
        
          User({this.name, this.email});
        
          Map toJson() => {
                'Name': name,
                'Email': email,
              };
        }
    
    class JSONGenerate {
      List<User> userData;
    
      JSONGenerate([this.userData]);
    
      Map toJson() {
        List<Map> userData = this.userData != null
            ? this.userData.map((i) => i.toJson()).toList()
            : null;
    
        return {
          'User Data': userData,
        };
      }
    } 
    
    class UserMinor extends StatefulWidget {
      @override
      _UserMinorState createState() => _UserMinorState();
    }
    
    class _UserMinorState extends State<UserMinor> {
      final form = GlobalKey<FormState>();
      static var _focusNode = new FocusNode();
      // finding same instance if initialized controller
      final controller = Get.find<UserMinorController>();
      @override
      Widget build(BuildContext context) {
        Widget bodyData() => DataTable(
              onSelectAll: (b) {},
              sortColumnIndex: 0,
              sortAscending: true,
              columns: <DataColumn>[
                DataColumn(label: Text("User Name"), tooltip: "User Name"),
                DataColumn(label: Text("User Email"), tooltip: "User Email"),
              ],
              rows: controller.userList // accessing list from Getx controller
                  .map(
                    (user) => DataRow(
                      cells: [
                        DataCell(
                          Text(user.name),
                        ),
                        DataCell(
                          Text(user.email),
                        ),
                      ],
                    ),
                  )
                  .toList(),
            );
    
        return Padding(
          padding: EdgeInsets.all(10.0),
          child: Column(
            children: <Widget>[
              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: () {
                                          if (validate() == true) {
                                            form.currentState.save();
                                            controller.addLanguagetoList(
                                              controller.nameController.text,
                                              controller.emailController.text,
                                            );
                                          }
                                        },
                                      ),
                                      ElevatedButton(
                                          child: Text("Save"),
                                          onPressed: () {
                                            form.currentState.save();
                                            String minorlanguageListJson =
                                                jsonEncode(controller.userList);
                                            print(minorlanguageListJson);
                                          }),
                                    ],
                                  ),
                                ],
                              ),
                            ),
                          ],
                        ),
                      ],
                    ),
                  ),
                ),
              ),
              // GetBuilder rebuilds when update() is called
              GetBuilder<UserMinorController>(
                builder: (controller) => bodyData(),
              ),
            ],
          ),
        );
      }
    
      bool validate() {
        var valid = form.currentState.validate();
        if (valid) form.currentState.save();
        return valid;
      }
    }
    
    class StepperBody extends StatefulWidget {
      @override
      _StepperBodyState createState() => new _StepperBodyState();
    }
    
    class _StepperBodyState extends State<StepperBody> {
      int currStep = 0;
      static var _focusNode = new FocusNode();
      GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
    
      @override
      void initState() {
        super.initState();
        _focusNode.addListener(() {
          setState(() {});
          print('Has focus: $_focusNode.hasFocus');
        });
      }
    
      @override
      void dispose() {
        _focusNode.dispose();
        super.dispose();
      }
    
      List<Step> steps = [
        new Step(
          title: const Text('Technical Language Basics'),
          isActive: true,
          state: StepState.indexed,
          content: UserMinor(),
        ),
      ];
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: new Form(
            key: _formKey,
            child: new ListView(
              children: <Widget>[
                new Stepper(
                  steps: steps,
                  type: StepperType.vertical,
                  currentStep: this.currStep,
                  onStepContinue: () {
                    setState(() {
                      if (currStep < steps.length - 1) {
                        currStep = currStep + 1;
                      } else {
                        currStep = 0;
                      }
                    });
                  },
                  onStepCancel: () {
                    setState(() {
                      if (currStep > 0) {
                        currStep = currStep - 1;
                      } else {
                        currStep = 0;
                      }
                    });
                  },
                  onStepTapped: (step) {
                    setState(() {
                      currStep = step;
                    });
                  },
                ),
                new ElevatedButton(
                  child: new Text(
                    'Save details',
                    style: new TextStyle(color: Colors.white),
                  ),
                  onPressed: () {
                    var technicalInfo = UserMinorController().userList;
                    JSONGenerate jsonGenerate = JSONGenerate(technicalInfo);
                    print(
                      jsonEncode(jsonGenerate),
                    );
                  },
                ),
              ],
            ),
          ),
        );
      }
    }
    
        class UserMinorController extends GetxController {
          TextEditingController nameController = TextEditingController();
          TextEditingController emailController = TextEditingController();
          int currentIndex = 0;
        
          List<User> userList = [
            User(name: "first language", email: "first value"),
            User(name: "second language", email: "second value"),
            User(name: "third language", email: "third value"),
          ];
        
        
        
          void addLanguagetoList(name, email) {
            userList.add(User(name: name, email: email));
            update();
          }
        }
    
    var technicalInfo = UserMinorController().userList;
    
     onPressed: () {
       var technicalInfo = Get.find<UserMinorController>().userList;
       JSONGenerate jsonGenerate = JSONGenerate(technicalInfo);
       print(jsonEncode(jsonGenerate));
    }