flutter 二维数组赋值问题

class ExpCellDetailP0J0 {
  int num;//序号
  SizeDetail sizeDetail; //格口尺寸参数
  bool isSelected; //是否选中

  SelectFileData backFillFile;//本地格口规格设置弹窗里填写后的回填中显示用的格口图片、视频文件


  ExpCellDetailP0J0(
      {this.num,
      this.sizeDetail,
      this.isSelected = false,

     // this.backFillFile,
      }) {
    this.sizeDetail = sizeDetail ?? SizeDetail();
  }

  ExpCellDetailP0J0.fromJson(dynamic json) {
    num = json['num'];
    sizeDetail = json['sizeDetail'] != null ? SizeDetail.fromJson(json['sizeDetail']) : null;
  }

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['num'] = num;
    if (sizeDetail != null) {
      map['sizeDetail'] = sizeDetail.toJson();
    }
    return map;
  }
}


class SizeDetail {
  int longSize; //长
  int wideSize; //宽
  int deepSize; //深

  SizeDetail({this.longSize, this.wideSize,this.deepSize});

  SizeDetail.fromJson(dynamic json) {
    longSize = json['longSize'];
    wideSize = json['wideSize'];
    deepSize = json['deepSize'];
  }

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['longSize'] = longSize;
    map['wideSize'] = wideSize;
    map['deepSize'] = deepSize;
    return map;
  }
}
 List<List<ExpCellDetailP0J0>> _expCellSpecsList = [];

//批量设置
  _batchSet(ExpCellDetailP0J0 cellInfo){
    print('批量赋值');
    for (var row in _expCellSpecsList) {
      for (var cell in row) {
        cell.publishStatus = cellInfo.publishStatus;
        cell.row = cellInfo.row;
        cell.column = cellInfo.column;
        cell.buyChargeDetailList = cellInfo.buyChargeDetailList;
        cell.rateChargeDetailList = cellInfo.rateChargeDetailList;
        cell.userCellFileUrlPOJODetail = cellInfo.userCellFileUrlPOJODetail;
        cell.sizeDetail = cellInfo.sizeDetail;
        cell.isSelected = false;
        cell.backFillFile = cellInfo.backFillFile;
      }
    }
    setState(() {});
  }



_singleSet(){
                                        for (var row in _expCellSpecsList) {
                                          for (var cell in row) {
                                            print('cell =${cell.toJson()}');
                                          }
                                        }
                                        print(' row= $row   column= $column');
                                        ExpCellDetailP0J0 resultBean = result;
                                        print('填写前的回填:${_expCellSpecsList[row][column].toJson()}');
                                       // _expCellSpecsList[row][column].sizeDetail = resultBean.sizeDetail;
                                         _expCellSpecsList[row][column].sizeDetail.deepSize = resultBean.sizeDetail.deepSize;
                                         _expCellSpecsList[row][column].sizeDetail.longSize = resultBean.sizeDetail.longSize;
                               
                                      print('填写后的回填:${_expCellSpecsList[row][column].toJson()}');

                                        for (var row in _expCellSpecsList) {
                                          for (var cell in row) {
                                            print('cell2 =${cell.toJson()}');
                                          }
                                        }
                                        _setBackFillFile(row,column);
                                      setState(() {});
                                    }
 

问题描述:给二维数组批量赋值后,再进行单个对象的深度赋值后_expCellSpecsList[row][column].sizeDetail.deepSize = resultBean.sizeDetail.deepSize;查询二维数组 print('cell2 =${cell.toJson()}');打印出来却是整个数组的deepSize参数都被赋值了;
更改:将赋值方法从_expCellSpecsList[row][column].sizeDetail.longSize = resultBean.sizeDetail.longSize;改为_expCellSpecsList[row][column].sizeDetail = resultBean.sizeDetail;后正常了。

问题原因在哪里?求路过的大神指点一下

### 在 Flutter 中使用数组循环嵌套渲染样式的实现方法 在 Flutter 中,可以通过 `ListView.builder` 或者 `Column/Row` 配合 `forEach` 和 `map` 方法来动态生成 UI 元素。当涉及到数组的嵌套时,可以利用 Dart 的集合展开运算符 (`...`) 来处理内部列表并将其平铺到外部列表中。 以下是具体的实现方式以及代码示例: #### 实现思路 1. 定义一个多维数组作为数据源。 2. 使用外层循环遍历顶层数组中的每一项。 3. 对于每项内的子数组,再次执行内层循环以生成对应的子组件。 4. 将内外两层的结果组合成最终的 Widget 列表,并传递给父级容器(如 `Column` 或 `ListView`)进行渲染。 --- #### 示例代码 以下是一个完整的例子,展示如何通过二维数组嵌套渲染按钮组: ```dart import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Array Nested Rendering Example')), body: Padding( padding: const EdgeInsets.all(8.0), child: ArrayNestedRendering(), ), ), ); } } class ArrayNestedRendering extends StatelessWidget { final List<List<String>> data = [ ['Item A', 'Item B'], ['Item C', 'Item D', 'Item E'], ['Item F'] ]; @override Widget build(BuildContext context) { return Column( children: data.map((outerList) { // 外层循环 return Column( crossAxisAlignment: CrossAxisAlignment.start, children: outerList.map((item) { // 内层循环 return ElevatedButton( onPressed: () {}, child: Text(item), ); }).toList(), // 转换为Widget列表 ); }).toList(), // 转换为Widget列表 ); } } ``` --- #### 关键点解析 1. **Dart 的 map 方法** - `data.map(...)` 是用于将原始数据转换为目标结构的核心工具。它允许我们逐一遍历数组中的每一个元素,并返回一个新的映射结果[^1]。 2. **集合展开运算符 (Spread Operator)** 如果需要进一步简化嵌套逻辑,可以考虑使用扩展语法 `...` 将多个子列表合并为单一列表。例如: ```dart var combinedList = [...listA, ...listB]; ``` 3. **性能优化** 当面对大量数据时,推荐使用 `ListView.builder` 替代静态构建器(如 `Column`)。这样能够按需加载可见区域的内容,从而减少内存占用和提升滚动体验[^2]。 --- #### 性能对比与建议 对于简单的页面布局,可以直接采用 `Column` 或 `Row` 进行排列;但如果涉及复杂场景或者大数据量,则应优先选用基于懒加载机制的控件,例如 `ListView.builder` 或 `GridView.builder`。这些高级组件不仅支持虚拟化技术,还具备更好的灵活性和可维护性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值