dictionary - 有没有更好的方法在 Dart 中编写这种数据结构?
问题描述
Dart 中的 Map 是一个哈希表,对吗?
Map starsData = {
'stars':{
'star1': {'x': 0, 'y': 10},
'star2': {'x': 0, 'y': 10}
}
};
下面这个对象在 JavaScript 中可以作为哈希表访问,更快!!我只想在 Dart 中做一些事情,但我不确定最好的方法是否是使用 Map。
const starsData = {
stars:{
'star1': {'x': 0, 'y': 10},
'star2': {'x': 0, 'y': 10}
}
};
解决方案
我已经在 Dart中重写了您的 JavaScript 实现(基于您链接的项目:https ://github.com/ToniCalfim/fallingstars/blob/master/index.js):
也可以通过以下方式进行测试: https ://dartpad.dev/900989f4e35e5a61200e4ad04ecd399a
import 'dart:html';
import 'dart:math' as math;
const starsDiameter = 1.25;
const colorPallete = [
'white',
'yellow',
'blue',
'red',
'orange',
'turquoise',
'purple',
'green',
'lightblue',
'lightyellow',
'lightgreen',
'darkred',
'darkblue',
'darkorange',
'darkturquoise',
'darkgreen'
];
final math.Random _rnd = math.Random();
int getRandomNumber(int min, int max) => min + _rnd.nextInt(max - min);
class Star {
int x, y;
int positionX = getRandomNumber(2, 650);
int positionY = getRandomNumber(3, 125);
double diameter = starsDiameter;
int pulsing = 0;
int blinking = 0;
int timeToFall = getRandomNumber(0, 7500);
int velocityToFall = getRandomNumber(1, 5);
int directionToFall = getRandomNumber(-1, 1);
String color = colorPallete[getRandomNumber(0, colorPallete.length)];
Star() {
x = positionX;
y = positionY;
}
}
final List<Star> stars = List.generate(175, (_) => Star());
void update() {
for (final currentStar in stars) {
final currentTimeToFall = currentStar.timeToFall;
if (currentTimeToFall != 0) {
currentStar.timeToFall = currentTimeToFall - 1;
} else {
final currentVelocityToFall = currentStar.velocityToFall;
final currentAngleToFall = currentStar.directionToFall;
final currentPositionX = currentStar.x;
final currentPositionY = currentStar.y;
currentStar.x = currentPositionX + 1 * currentAngleToFall;
currentStar.y = currentPositionY + currentVelocityToFall;
}
}
}
final CanvasElement canvas = querySelector('#canvas') as CanvasElement;
final CanvasRenderingContext2D context2D = canvas.context2D;
void drawStars() {
context2D.clearRect(
0, 0, context2D.canvas.width, context2D.canvas.height); // Clear canvas
for (final currentStar in stars) {
context2D.beginPath();
context2D.fillStyle = currentStar.color;
context2D.arc(currentStar.x, currentStar.y, starsDiameter, 0, 2 * math.pi);
context2D.fill();
context2D.closePath();
}
}
void animateLoop([num highResTime]) {
update();
drawStars();
window.requestAnimationFrame(animateLoop);
}
void main() {
animateLoop();
}
通过查看您的代码,我看不出为什么要将星星保存在 Map 或其他与哈希表相关的结构中。您以两种方式使用星星:绘制和更新。在这两种情况下,您都只是遍历所有星星,这可以通过使用一个简单的列表并遍历所有元素来完成。
我应该补充一点,我不是前端程序员,我无法真正判断您绘制 2D 画布的方式是否是最有效的方式。我转换后的代码只是试图展示如何在 Dart 中构造数据。
推荐阅读
- flutter - 如何在按钮的 onTap 函数中构建另一个小部件
- apache - apache2.service:控制进程退出,code=exited status=139
- php - 如何在 Postman 中测试 PHP cURL 文件?
- powershell - 在 powershell 中使用 -replace 将“../”替换为“ref/”时,点(“..”)成为通配符
- java - 在尝试使用 recyclerview 时,我无法在视图持有者的对象中获取内容
- javascript - 调用 Google App 脚本上的图像文件上传到 GoogleDrive
- asp.net-mvc - Asp.net MVC 图像上传和预览
- python - np.zeros 和 np.full 的内存消耗和性能差异的原因
- memory - 使用 TIdFTP 下载大文件时出现内存不足错误
- amazon-web-services - 如何在 Google Cloud Platform 控制台中创建新 API?