You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter列表值不更新:machineDetails无法获取_machines的code值

解决Flutter列表赋值后字段仍为null的问题

从你提供的代码和打印输出来看,核心问题很明确:machineDetails列表的每个元素都是null,虽然列表长度和_machines一致(都是6),但你尝试用可选链?.赋值时,因为对象本身不存在,赋值操作直接被短路了,所以code字段始终是null。

问题原因分析

你打印的MachineDetails $i code: null其实已经给出了线索:当执行machineDetails[i]?.code = _machines[i].vCodigo时,machineDetails[i]是null,可选链操作符?.会直接终止后续操作,并不会真正给code赋值。这大概率是因为你初始化machineDetails时,只是创建了一个指定长度的列表,但没有为每个位置创建对应的MachineDetail实例(比如用了List.filled(6, null)这类方式)。

解决方案

要解决这个问题,你需要先确保machineDetails的每个位置都存在一个已初始化的MachineDetail对象实例,再进行赋值操作:

  1. 提前初始化machineDetails为包含实例的列表
    在进入赋值循环之前,先生成对应数量的MachineDetail实例填充列表:

    // 假设MachineDetail是你的自定义数据类,这里生成对应数量的实例
    machineDetails = List.generate(_machines.length, (index) => MachineDetail());
    
  2. 修改赋值逻辑,移除不必要的可选链
    现在列表元素都是有效的实例了,不需要再用?.,直接赋值即可:

    Future<void> _registerTime(int index) async { 
      try { 
        setState(() { 
          _loading = true; 
        }); 
        String res = await gruposRepo.timeRegisterWorks(
          widget.worker.toString(), 
          widget.work, 
          widget.product, 
          widget.task, 
          _machines[index].vCodigo
        ); 
        print(res); 
        print("MachineDetails Lenght RegisterTime: ${machineDetails.length}");
    
        // 先初始化machineDetails的实例
        machineDetails = List.generate(_machines.length, (index) => MachineDetail());
    
        for (int i = 0; i < _machines.length; i++) { 
          print('Machines $i code: ${_machines[i].vCodigo}'); 
          // 直接赋值,不需要可选链
          machineDetails[i].code = _machines[i].vCodigo; 
          print('MachineDetails $i code: ${machineDetails[i].code}'); 
          if (res == '1') { 
            machineDetails[i].working = true; 
          } else if (res == '2') { 
            machineDetails[i].working = false; 
          } 
        } 
        print(machineDetails[index].working); 
        showDialog( 
          context: context, 
          builder: (context) { 
            return AlertDialog( 
              title: Text(Translations.of(context).trans('saved')), 
              actions: <Widget>[ 
                FlatButton( 
                  child: Text('OK'), 
                  onPressed: () => Navigator.of(context).pop(), 
                ) 
              ], 
            ); 
          }); 
      } catch (e) { 
        this._errorMsg = e.toString(); 
      } 
      setState(() { 
        _loading = false; 
      }); 
    }
    

额外检查点

  • 确认MachineDetail类的code和working字段不是final修饰的(或者有对应的setter方法),否则也会导致赋值失败;
  • 如果machineDetails是在其他地方初始化的,也要确保那里是生成实例而非填充null。

内容的提问来源于stack exchange,提问作者André Sousa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:07:16