А. Сравнение времени
Как люди, мы всегда думаем, что будет больше straight-forward
сравнить значение часа 2 раза windows.
Но, на самом деле, для dart
это быстрее сравнивать два времени windows вместе с его минутами и секундами.
Чтобы получить эту привилегию, нам нужно преобразовать весь формат метки времени, который обычно имеет тип String
.
Мы преобразует его в DateTime с помощью этого syntax
:
var someTimestamp = "2020-06-19 09:00:00";
var someDatetimeObject = DateTime.parse(someTimestamp); // 9 a.m.
или, если вы новичок в dart
, вы можете сделать его более интуитивно понятным, объединив их Type
.
В этом примере ниже мы заменим var
, который показывает переменную Dynami c, на большее количество c type:
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 утра и закрывается в 17:00
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;
}
}
Б. Periodically Refre sh Page / Widget
Нам нужно запускать 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. L oop Через возможные маркеры
Обратите внимание, в этом разделе я опубликую PSEUDUCODE
, относящееся к маркерам, потому что я не знаю, конкретно вы решаете эту проблему.
После того, как у нас есть refreshMarkers
, в первом разделе мы теперь знаем, что он будет выполняться каждые 5 секунд.
Теперь нам нужно определить его бизнес-логи c:
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%
может не применяться к вашему приложению, но я надеюсь, что теперь он будет более понятным