如何通过值调用获取flutter map的值
How to get the value of flutter map by call by value
我正在使用 TMDB 开发电影应用程序。
创建预订系统共需要3条数据
1.MovieList的索引
2.date的指数
3.seat状态
我一直在尝试将其处理为地图。
//Seat Status total 200 Seat
List<bool> _seat = [];
for(int nIndex=0; nIndex<200; nIndex++){
_seat.add(false);
}
//Date index(total 7 days) + Seat status
Map _date = Map();
for(int nIndex=0; nIndex<7; nIndex++){
_date[nIndex] = _seat.toList();
}
//TMDB MovieList index
Map _movie = Map();
for(int nIndex=0; nIndex<MoviesList.length; nIndex++){
_movie[nIndex] = _date;
}
我想要的数值正常输入
但是,更改一个座位数据时,地图中的所有座位数据都会更改。
我注意到这是因为输入了地图和列表引用。
你知道如何通过按值调用而不是通过引用调用来获取值吗?
seat = List.filled(200, false, growable: true);
date = List.generate(7, (_) => List.from(seat));
movie = List.generate(length, (_) => List.from(date));
我的代码如上。
例如
movie[0][0][0] = false; // Change value
print(movie[0][0][0]); // result false
print(movie[1][0][0]); // result false
这样,数值一起变化
为了创建一个与前一个列表引用具有相同值的新列表引用,您可以调用 List.from
.
像这样:
_date[nIndex] = List.from(_seat);
您可以对地图使用类似的语法
_movie[nIndex] = Map.from(_date);
编辑
看来这个解决方案实际上行不通,dart可以使用.from
来复制一个列表,甚至可以复制一个列表的列表,但是复制一个列表的列表?这人太过分了!它无法处理,它只会复制一个级别。值得庆幸的是,一旦你知道它发生的原因,解决这个问题就很简单了:
var seat = List.filled(3, false, growable: true);
var date = List.generate(4, (_) => List.from(seat));
var movie = List.generate(5, (_) => List.from(date.map((v) =>
List.from(v))));
movie[0][0][0] = true; // Change value
print(movie[0][0][0]); // true
print(movie[1][0][0]); // false (default value)
对于最后一个,我不是从 seat 创建新列表,而是首先使用 map 将每个列表复制到一个新列表,然后我将这些新列表复制到一个新列表。
我相信这解决了我们遇到的问题
PS
这是一个推荐,如果你不介意,你可以停止阅读:
如果要生成包含 200 个假值的列表,可以改用此语法:
List<bool> _seat = List.filled(200, false, growable: true);
这样可以用更短、更易读的方式来做同样的事情。
声明映射时,首选此语法:
Map<int, List<bool>> _date = {};
Map<int, Map<int, List<bool>>> _movie = {};
我知道它看起来有点恶心,但它可以确保您不会在地图中添加错误的类型
最后,您一开始为什么要使用地图?您的地图的行为与列表完全相同,因为键是索引,您可以使用生成构造函数而不是 for 循环来生成所述列表,如下所示:
//Date index(total 7 days) + Seat status
List<List<bool>> _date = List.generate(7, (_) => List.from(_seat));
//TMDB MovieList index
List<List<List<bool>>> _movie = List.generate(
MoviesList.length, (_) => List.from(_date));
同样,语法看起来很粗糙,那是因为所有的嵌套列表,可能最好制作一个 class 可以以更整洁和类型安全的方式存储值,但我缺少向您展示如何编写这样的 class.
的信息
我正在使用 TMDB 开发电影应用程序。
创建预订系统共需要3条数据
1.MovieList的索引
2.date的指数
3.seat状态
我一直在尝试将其处理为地图。
//Seat Status total 200 Seat
List<bool> _seat = [];
for(int nIndex=0; nIndex<200; nIndex++){
_seat.add(false);
}
//Date index(total 7 days) + Seat status
Map _date = Map();
for(int nIndex=0; nIndex<7; nIndex++){
_date[nIndex] = _seat.toList();
}
//TMDB MovieList index
Map _movie = Map();
for(int nIndex=0; nIndex<MoviesList.length; nIndex++){
_movie[nIndex] = _date;
}
我想要的数值正常输入
但是,更改一个座位数据时,地图中的所有座位数据都会更改。
我注意到这是因为输入了地图和列表引用。
你知道如何通过按值调用而不是通过引用调用来获取值吗?
seat = List.filled(200, false, growable: true);
date = List.generate(7, (_) => List.from(seat));
movie = List.generate(length, (_) => List.from(date));
我的代码如上。
例如
movie[0][0][0] = false; // Change value
print(movie[0][0][0]); // result false
print(movie[1][0][0]); // result false
这样,数值一起变化
为了创建一个与前一个列表引用具有相同值的新列表引用,您可以调用 List.from
.
像这样:
_date[nIndex] = List.from(_seat);
您可以对地图使用类似的语法
_movie[nIndex] = Map.from(_date);
编辑
看来这个解决方案实际上行不通,dart可以使用.from
来复制一个列表,甚至可以复制一个列表的列表,但是复制一个列表的列表?这人太过分了!它无法处理,它只会复制一个级别。值得庆幸的是,一旦你知道它发生的原因,解决这个问题就很简单了:
var seat = List.filled(3, false, growable: true);
var date = List.generate(4, (_) => List.from(seat));
var movie = List.generate(5, (_) => List.from(date.map((v) =>
List.from(v))));
movie[0][0][0] = true; // Change value
print(movie[0][0][0]); // true
print(movie[1][0][0]); // false (default value)
对于最后一个,我不是从 seat 创建新列表,而是首先使用 map 将每个列表复制到一个新列表,然后我将这些新列表复制到一个新列表。
我相信这解决了我们遇到的问题
PS
这是一个推荐,如果你不介意,你可以停止阅读:
如果要生成包含 200 个假值的列表,可以改用此语法:
List<bool> _seat = List.filled(200, false, growable: true);
这样可以用更短、更易读的方式来做同样的事情。
声明映射时,首选此语法:
Map<int, List<bool>> _date = {};
Map<int, Map<int, List<bool>>> _movie = {};
我知道它看起来有点恶心,但它可以确保您不会在地图中添加错误的类型
最后,您一开始为什么要使用地图?您的地图的行为与列表完全相同,因为键是索引,您可以使用生成构造函数而不是 for 循环来生成所述列表,如下所示:
//Date index(total 7 days) + Seat status
List<List<bool>> _date = List.generate(7, (_) => List.from(_seat));
//TMDB MovieList index
List<List<List<bool>>> _movie = List.generate(
MoviesList.length, (_) => List.from(_date));
同样,语法看起来很粗糙,那是因为所有的嵌套列表,可能最好制作一个 class 可以以更整洁和类型安全的方式存储值,但我缺少向您展示如何编写这样的 class.
的信息