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
相关产品推荐
相关产品推荐

