Установить состояние маркеров при выполнении условия - PullRequest
0 голосов
/ 19 июня 2020

У меня есть маркер на карте, который показывает состояние открытого или закрытого места. Я использую следующий метод, чтобы проверить каждое место, открыто или закрыто.

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 () находится между заданными часами без дальнейшего взаимодействия с пользователем ?

1 Ответ

2 голосов
/ 19 июня 2020

А. Сравнение времени

Как люди, мы всегда думаем, что будет больше 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% может не применяться к вашему приложению, но я надеюсь, что теперь он будет более понятным

...