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

Flutter静态变量与局部变量关联疑问:为何值变化表现不同?

Flutter中静态变量与局部变量的关联问题解析

问题描述

我对Flutter中静态变量与局部变量的关联逻辑存在疑惑,以下是我的代码示例:

void main() {
  var tempData = A.getData();
  var tmpMyInt = A.myInt;
  
  print("tmpMyInt Before: ${tmpMyInt.toString()}");
  print('tempData Before: ${tempData}');
  
  A.data[0]= "1 piggy";
  A.data[1]= "2 piggy";
  A.myInt = 150;
  
  print('tempData after : ${tempData}');
  print("tmpMyInt after: ${tmpMyInt.toString()}");
}

class A {
  static List<dynamic> data = [
    "1","2"
  ];
  
  static int myInt = 10;

  static getData() {
    return data;
  }

  static setData(int idx, var value) {
    data[idx]= value;
  }
}

调试输出结果如下:

tmpMyInt Before: 10
tempData Before: [1, 2]
tempData after : [1 piggy, 2 piggy]
tmpMyInt after: 10

我想知道为什么tempData的值在修改前后发生了变化,而tmpMyInt的值却没有变化?如代码所示,我仅修改了静态变量data和myInt的值,并未在main函数中更新局部变量tempData和tmpMyInt的值。

原因解析

这本质是值类型和引用类型的区别在Dart(Flutter基于Dart)中的体现:

  • myInt是值类型(int属于值类型):执行var tmpMyInt = A.myInt;时,会把A.myInt的当前值(10)复制一份给局部变量tmpMyInt。后续修改A.myInt = 150;只是改变了静态变量自身的存储值,和已经复制出去的tmpMyInt没有关联,所以tmpMyInt依然保持初始的10。
  • data是引用类型(List属于引用类型):调用A.getData()返回data时,实际返回的是这个列表对象在内存中的引用地址。局部变量tempData存储的就是这个引用地址,它和静态变量A.data指向的是同一个内存中的列表对象。因此当你通过A.data[0] = "1 piggy"修改列表内容时,本质是修改了这个共享的内存对象,tempData因为指向同一个对象,自然能看到修改后的结果。

如果想让tempData不受A.data修改的影响,可以在getData方法中返回列表的副本,示例代码如下:

static getData() {
  return List.from(data); // 返回新的列表对象,和原列表不再共享内存
}

内容的提问来源于stack exchange,提问作者msa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:26:13