Flutter:列表数据更改时 getx 控制器未更新。我如何确保 GetX 控制器知道添加的每个列表?

2023-12-11

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

enter image description here

[{"Name":"first language","Email":"first value"},{"Name":"second language","Email":"second value"},{"Name":"third language","Email":"third value"},{"Name":"test","Email":"test"}]

但是,当我单击底部的“保存”按钮时,会打印硬编码列表,而不是我们输入的数据。

enter image description here

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

{"User Data":[{"Name":"first language","Email":"first value"},{"Name":"second language","Email":"second value"},{"Name":"third language","Email":"third value"}]}

代码如下:-

  1. 模型.dart
    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,
    };
  }
} 
  1. 用户.dart
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;
  }
}
  1. 步进飞镖
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),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}
  1. GetX 控制器类
    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;

在 GetX 中,您需要使用以下命令“查找”控制器的相同实例Get.find<UserMinorController>()。这会找到具有您要添加到的实际列表的同一实例。你这样做的方式是打印出一个不同的实例UserMinorController这就是为什么它只打印出硬编码数据。

Your onPressed应该看起来像这样。

 onPressed: () {
   var technicalInfo = Get.find<UserMinorController>().userList;
   JSONGenerate jsonGenerate = JSONGenerate(technicalInfo);
   print(jsonEncode(jsonGenerate));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:列表数据更改时 getx 控制器未更新。我如何确保 GetX 控制器知道添加的每个列表? 的相关文章

  • Flutter:将字符串转换为 Map

    我正在使用 SQFlite 在本地存储数据 我有一个表 其中有一个名为 json 的字段 该字段的类型为 TEXT 并存储转换为字符串的 json 例如 name Eduardo Age 23 性别男 到目前为止 一切正常 但随后我需要从数
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • 使用 NewtonSoft 在一行中生成 JSON 对象

    我正在使用 JSON 库牛顿软件 http nuget org packages newtonsoft json生成 JSON 字符串 JObject out JObject FromObject new typ photos return
  • 来自 iPhone/iPad 的 json Web 服务

    有人可以帮助我解决如何从 iphone 或 ipad 使用 json Web 服务的问题吗 这里我的要求是使用 API 密钥实现 json webservice 如果可能的话发布一些教程或示例链接 谢谢 规范的 JSON 处理库是here
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • 包含 contains 的 json 格式查询

    我在 ansible 中有以下 json 输出 active transaction null cores 4 hostname alpha auth wb01 active transaction null cores 4 hostnam
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • Elasticsearch:预期的字段名称,但得到了 START_OBJECT

    我一直在尝试运行以下查询 但每次运行时都会收到以下错误 nested ElasticsearchParseException Expected field name but got START OBJECT field value fact
  • 如何反序列化键名.Net中包含点(.)的Json字符串[重复]

    这个问题在这里已经有答案了 odata metadata sometext odata nextLink sometext value odata type SP Data RegionsListItem odata id 07404daa
  • 将嵌套字典键值转换为 pyspark 数据帧

    我有一个 Pyspark 数据框 如下所示 我想提取 dic 列中的那些嵌套字典并将它们转换为 PySpark 数据帧 像这样 请让我知道如何实现这一目标 Thanks from pyspark sql import functions a
  • Groovy - JsonSlurper 解析 JSON 文件

    我有一个类似于下面的 JSON 文档 我正在尝试在 Groovy 中解析它 基本上对于每所学校 学校信息 我想抓住SCHOOL COUNTRY和其他领域 我正在尝试下面的代码 但它没有返回我需要的内容 对于列出的每所学校 1 000 所 我
  • 从 php 到 JavaScript 的数组

    我正在尝试使用 json 将数组列表从 php 传输到 javascript 但它不起作用 JS ajax url getProfilePhotos php type post post or get method data if you
  • 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

    我目前正在开发一个具有大量服务器端通信的 Android 应用程序 昨天 我收到一份错误报告 称用户无法发送 简单 特殊字符 例如 我搜索过但没有找到任何有用的东西 可能重复 没有答案 https stackoverflow com que
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • 查找文本的确切边界

    我需要知道一段文本的确切边界 相当于获取文本边界 https developer android com reference android graphics Paint html对于安卓 我意识到这在某种程度上与 Flutter 的设计背
  • 尝试在模拟器上安装第二个 flutter 应用程序时出错

    我创建了一个简单的 flutter 应用程序并在 android 模拟器上运行它 效果还不错 现在我创建了另一个 当我尝试在模拟器上运行它时 我得到 Error ADB exited with exit code 1 adb failed
  • dart json.encode(data) 不能接受其他语言

    我目前正在使用 Dart 进行 Web 开发 使用mockclient实现服务 但是 出现以下错误 下面的实现代码是一个继承mockClient的内存web api服务 调用client send 并返回结果的代码 test value是j
  • 如何在flutter中的命名路由中传递多个参数

    我正在尝试将多个参数传递给命名路由 我尝试了很多事情 但到目前为止还没有成功 谁能告诉我如何实现这一目标 路线 dart import package flutter cupertino dart import package flutte
  • Flutter:如何在flutter中指定设备id?

    如何在flutter run中选择设备id 请使用 d 标志指定设备 或使用 d all 对所有设备进行操作 iPhone 6 54XXXXXX35130ebefd38f ios iOS 10 3 3 iPhone 7 Plus BA8CX

随机推荐

  • 将具有 Alpha 通道的图像复制到具有自定义背景颜色的剪贴板?

    Code private void Foo Canvas canvas The content is a bit larger Size size new Size canvas ActualWidth 1 1 canvas ActualH
  • x86汇编linux中如何解释系统调用

    我对为什么 如何在 Linux 环境中的 x86 程序集中打印一个值感到困惑 例如 如果我想打印一个值 我会这样做 mov eax 4 mov ebx 1 mov ecx msg mov edx msgLength int 80h 现在我明
  • AKS 创建的服务主体密码过期

    我使用 创建 Kubernetes 集群 功能在 Azure 门户中创建了 AKS 集群 并允许其创建新的服务主体 我开始怀疑该委托人使用的凭证是否过期 为了避免 K8s 在凭证过期时与 Azure 通信出现问题 我开始查看已创建的帐户 如
  • jQuery Mobile 在一个对话框中显示多个对话框

    我已经搜索过 但没有找到这样做的例子 我希望能够为 jQM 打开一个对话框 并在一个对话框内进行逐步过程 我认为这需要将多个对话框加载到一个对话框中 并且不知道这是否可行 我们将 Backbone 与 jQM 结合使用 并希望能够在对话框中
  • 维持 mgo 会话的最佳实践

    我目前正在使用带有 mgo lib 的 mongodb 作为 Web 应用程序 但我不确定我使用它的方式是否良好 package db import gopkg in mgo v2 const MongoServerAddr 192 168
  • pymongo 按日期时间分组

    我试图按日期字段 日期时间 搜索集合和分组记录 我知道 pymongo 将它们转换为背景上的正确类型 ISODate 或类似的东西 问题是 由于日期时间对象具有日期 时间 时区 我如何告诉组运算符仅使用日期部分 因为否则我不会得到所需的分组
  • ASP.NET AJAX 返回 JSON 但未识别为 JSON

    我有这个功能可以让我返回经理列表 function getManagers var jqxhr ajax type POST contentType application json charset utf 8 url webservice
  • 第一个 postLink() 不创建表单

    使用已经存在的代码烘焙成 CRUD 我有以下代码删除一个项目 问题是它说谎了包裹在 FORM 标签中 所以最终发生的是Cake 不包含 postLink 将提交的表单 是否有另一种方法即使在我增加安全设置时仍然可以保持 Cake 基础设施的
  • 用Python发送广播

    我正在尝试学习编写套接字 在Python 3中 我只是尝试从服务器发送广播并从客户端接收它 我的问题是 每当我尝试将数据包发送到 255 255 255 255 时 似乎实际上没有发送任何内容 我尝试使用wireshark查找数据包 但除了
  • 当我复制电子表格时,脚本/触发器不起作用

    我创建了一个电子表格onEdit 基于名为的函数的触发器fillvalues 而且效果很好 我需要制作此电子表格的多个副本 因为它用于制作工作报告 但是当我制作副本时 脚本不起作用 因为触发器处于非活动状态或者需要授权才能运行 如何克服这个
  • 如果 Flask 上不存在表,如何使用 SQLAlchemy 创建表?

    我正在使用 SQLAlchemy 并且有以下代码 Model class User db Model tablename user table args schema task useexisting True id Column Inte
  • 如何矢量化寻找向量中最近的点

    BigList rand 20 3 LittleList rand 5 3 我想为大列表中的每一行找到小列表中 最接近 的行 如欧几里德范数所定义 即 k 3 维度中相应值之间的距离平方和 我可以看到如何使用两个循环来执行此操作 但似乎应该
  • 如何确定我刚刚在 Cucumber 的 AfterStep 挂钩中执行了哪一步?

    我正在编写一个要在AfterStep黄瓜的回调 https github com cucumber cucumber wiki Hooks step hooks 我怎样才能知道调用这个钩子之前执行了哪一步 使用gem cucumber 2
  • 使用 data.table 滞后面板数据

    我目前使用滞后面板数据data table通过以下方式 require data table x lt data table id 1 10 t rep 1 10 each 10 v 1 100 setkey x id t so that
  • 如何创建具有 1 GB 堆的可执行 jar 文件

    我创建了一个类 它提供一个包含系统性能的文本文件作为输出 我想将它作为可执行文件罐 但是当我运行 Jar 时 我想将堆增加到 1 GB 如果我们运行这个程序 我可以通过这样的运行来做到这一点 java Xms1200m Xmx1300m S
  • 使用 Clearcase 创建标签

    我想通过明确指定从任何地方创建标签VOB姓名 不幸的是 无论我如何指定我的VOB我总是收到此错误 cleartool mklbtype global nc MyVOBName MY LABEL NAME cleartool Error In
  • 将类型传递给方法?

    我需要一些帮助来指明正确的方向 我想创建一个可以处理不同类型的方法 我需要以某种方式传递这些类型并以某种方式使用它们 任何关于这方面的指导都会很棒 这是方法 其中 TypeINeedToPassIn 是 是的 你猜对了 我需要传入的类型 p
  • 访问相同BLE外设的iOS应用程序:如何区分?

    我必须遵循以下场景 我的应用程序请求并接收来自 BLE 外设 血糖仪 的数据 用户可能安装了另一个应用程序 来自另一个开发人员 该应用程序也与外围设备通信 我注意到我的应用程序收到了由其他应用程序发起的请求的特征通知 这导致我的应用程序接收
  • 从 mediawiki 中的电子邮件生成文章

    我想发送一封电子邮件到 mediawiki 可以获取的地址 并让 mediawiki 接收它并从中生成一个新页面作为起点 更复杂的东西 比如类别 可以稍后再做 我在网上搜索了一下 没有发现任何明显的东西 我以前没有针对 mediawiki
  • Flutter:列表数据更改时 getx 控制器未更新。我如何确保 GetX 控制器知道添加的每个列表?

    我只是在步进器中有一个表单 有两个字段 名称 和 电子邮件 添加 按钮工作正常 并按预期将姓名和电子邮件添加到列表中 当我单击 保存 时 将打印 JSON 数据以及列表中的所有可用数据 Name first language Email f