gpt4 book ai didi

flutter - 当条件为真时设置标记的状态

转载 作者:行者123 更新时间:2023-12-03 04:21:22 29 4
gpt4 key购买 nike

我在 map 上有一个标记,用于显示某个地方打开或关闭的状态。
我正在使用以下方法检查每个位置是否打开或关闭。

bool chekIfIsOpen() {
var now = DateTime.now();
int hour = int.parse(now.hour.toString() + mintues);
if (hour >= horaireOfToDay && hour <= horaireOfToDay)
return true;
else
return false;
}




setState(() {
_markers.add(Marker(
markerId: MarkerId(
p.geoPoint.longitude.toString()),
position: point,
onTap: ,
icon: status == Status.open
? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen)
: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueRed)));
});

现在我的问题是,当var now = DateTime.now.hour()在给定的小时数 之间且没有进一步的用户交互时,如何自动更新标记的状态?

最佳答案

A.时间比较
作为人类,我们始终认为比较2个时间窗口的小时值会更多straight-forward
但是,实际上,对于dart,比较两个时间窗口及其分钟和秒会更快。
要获得此特权,我们需要转换所有时间戳格式,通常是String类型。
我们将使用以下syntax将其转换为DateTime:

    var someTimestamp = "2020-06-19 09:00:00";
var someDatetimeObject = DateTime.parse(someTimestamp); // 9 a.m.
或者,如果您不是 dart的新手,可以通过将 Type配对来使其更加直观。
在下面的示例中,我们将显示动态变量的 var替换为更多静态类型:
    String someTimestamp = "2020-06-19 09:00:00";
DateTime someDatetimeObject = DateTime.parse(someTimestamp); // 9 a.m.
简而言之,我想您将拥有这部分代码:
A.1最终代码
  bool checkIfIsOpen() {
var horaireOfTodayOpen = DateTime.parse("2020-06-19 09:00:00"); // 9 a.m.
var horaireOfTodayClose = DateTime.parse("2020-06-19 17:00:00"); // 5 p.m.
var now = new DateTime.now();
if (now.isBefore(horaireOfTodayClose) && now.isAfter(horaireOfTodayOpen)) {
return true;
} else {
return false;
}
}
A.2详细说明步骤
1.首先,您需要两个时间窗口
例如,某个组织在上午9点开放,在下午5点关闭
    var horaireOfTodayOpen = DateTime.parse("2020-06-19 09:00:00"); // 9 a.m.
var horaireOfTodayClose = DateTime.parse("2020-06-19 17:00:00"); // 5 p.m.
2.然后您需要有当前时间
使用标准语法:
    var now = new DateTime.now();
3.最后,使用实例方法进行比较
您可以在此官方文档 page中阅读它
    if (now.isBefore(horaireOfTodayClose) && now.isAfter(horaireOfTodayOpen)) {
return true;
} else {
return false;
}
}

B.定期刷新页面/小部件
我们需要触发setState,每隔5秒说一次。
1.制作Timer属性并使用它初始化
import 'dart:async'; // add this

class MapMarkerPage extends State<MyHomePage> {
Timer timer; // add this

@override
void initState() {
super.initState();
const oneSec = const Duration(seconds: 5); // add this
timer = new Timer.periodic(oneSec, (Timer t) => refreshMarkers()); // add this
}

...
}

2.遍历可能的标记

Please note, in this section, I will post PSEUDUCODE related to markers, because I don't know specifically you solve this.


在第一部分中有了 refreshMarkers之后,我们现在知道它将每5秒执行一次。
现在,我们需要定义其业务逻辑:
import 'dart:async';

class MapMarkerPage extends State<MyHomePage> {
List<dynamic> markers = []; // add this

bool checkIfIsOpen(horaire) {
var horaireOfTodayOpen = DateTime.parse("2020-06-19 09:00:00"); // 9 a.m.
var horaireOfTodayClose = DateTime.parse("2020-06-19 17:00:00"); // 5 p.m.
var now = new DateTime.now();
if (now.isBefore(horaireOfTodayClose) && now.isAfter(horaireOfTodayOpen)) {
return true;
} else {
return false;
}
}

void refreshMarkers() {
List<Widget> tempMarkers = [];

// Loop through possible organization
// Pseudocode
for (horaire in horaires){
if checkIsOpen(horaire){
tempMarkers.add(Marker(
markerId: MarkerId(
p.geoPoint.longitude.toString()),
position: point,
onTap: ,
icon: status == Status.open
? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen)
: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueRed)));
}
}

markers = tempMarkers; // Renew markers
setState(() {}); // Force Widget to Update
}
}

希望您能理解主要思想,最终代码可能不适用于您的应用程序 100%,但希望现在可以更清楚

关于flutter - 当条件为真时设置标记的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62462099/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com