我试图将一个列表的值复制到另一个列表,我使用了三个按钮,第一个按钮用于向mylist添加值,第二个按钮用于清除mylist,第三个按钮用于将值从mynewlist复制到mylist。
我试过这个
List<String> mylist = [
'Albania',
'Andorra',
'Armenia',
'Austria',
'Azerbaijan',
'Belarus',
'Belgium',
'Albania',
'Andorra',
'Armenia',
'Austria',
'Azerbaijan',
'Belarus',
'Belgium',
];
List<String> mynewlist = [
'Albania',
'Andorra',
'Armenia',
'Austria',
'Azerbaijan',
'Belarus',
'Belgium',
'Albania',
'Andorra',
'Armenia',
'Austria',
'Azerbaijan',
'Belarus',
'Belgium',
];
Padding(
padding: const EdgeInsets.all(5.0),
child: Row(
children: <Widget>[
Expanded(
child: FlatButton(
onPressed: () {
setState(() {
print('clicked 1st');
print(mylist.length);
print(mynewlist.length);
mylist.add('sdsds');
});
},
child: Container(
child: Column(
children: <Widget>[
Image.asset(
'images/bulb.png',
width: 100,
height: 100,
),
Text('bulb')
],
),
),
),
),
Expanded(
child: FlatButton(
onPressed: () {
setState(() {
print('clicked 2nd');
print(mylist.length);
print(mynewlist.length);
//after i set mylist = mynewlist; when i click this button it clears the old and new list.
mylist.removeRange(0, mylist.length);
});
},
child: Container(
child: Column(
children: <Widget>[
Image.asset(
'images/bulb.png',
width: 100,
height: 100,
),
Text('bulb')
],
),
),
),
),
Expanded(
child: FlatButton(
onPressed: () {
setState(() {
print('clicked 3rd');
print(mylist.length);
print(mynewlist.length);
mylist = mynewlist;
});
},
child: Container(
child: Column(
children: <Widget>[
Image.asset(
'images/bulb.png',
width: 100,
height: 100,
),
Text('bulb')
],
),
),
),
),
],
),
)
在最初的时候,它工作得很完美,第二次我点击第二个按钮时,它会清除MyList和MyNewList。
如何在不清除新列表的情况下复制第二个列表的值
6条答案
按热度按时间jhkqcmku1#
使用
myList = List.from(mynewlist);
代替mylist = mynewlist;
m4pnthwp2#
这是因为你复制的是对象引用(mylist = mynewlist)而不是列表的内容。所以在第一次点击之后,mylist在内存中有一个与mynewlist相同的对象引用。所以对其中一个对象的任何操作都会影响两个对象。
要解决您的问题,您需要保持对象引用不变,只复制这些列表的内容。
waxmsbnn3#
var YOURCOPY = YOURLIST.map((v) => v).toList();
ygya80vv4#
您也可以在任何您想要创建副本而不是引用的可迭代对象(在本例中为List)上调用method:toList()。
9udxz4iz5#
自定义类列表的深层副本
如果您有一个类列表,请确保克隆/复制每个类。否则,如果您更改了原始列表中的对象,新列表中的对象也会随之更改。以下是一种防止方法:
1.将
clone()
函数添加到类中1.要进行复制,请通过每个元素进行Map并克隆
gzszwxb46#
使用:mylist = [...mynewlist]。它复制www.example.com中的所有项目mynewlist.it但不将mynewlist的内存地址复制到mylist。
有关详细信息,请访问:您可以搜索“在Flutter或飞镖中展开操作”。