如何通过值调用获取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.

的信息