Как прекратить проверку условий при нахождении одного совпадения

Итак, у меня есть список занятий, который парсится из html-таблицы. Я хочу реализовать функцию выделения текущей и следующей пары. Первое у меня получилось сделать через сравнение текущего времени с временем начала и конца занятия, однако второе вызывает проблемы. Оно работает, но только если текущий час и час начала занятия совпадают.

  bool isCurrentTimeInEntry(TimeOfDay nowTime, TimeOfDay startTimeOfDay, TimeOfDay endTimeOfDay) {
      return isSameTime(nowTime, startTimeOfDay) ||
             (nowTime.hour > startTimeOfDay.hour && nowTime.hour < endTimeOfDay.hour) ||
             (nowTime.hour == startTimeOfDay.hour && nowTime.minute >= startTimeOfDay.minute && nowTime.hour < endTimeOfDay.hour) ||
             (nowTime.hour == endTimeOfDay.hour && nowTime.minute <= endTimeOfDay.minute && nowTime.hour > startTimeOfDay.hour) ||
             (nowTime.hour == startTimeOfDay.hour && nowTime.minute >= startTimeOfDay.minute && nowTime.hour == endTimeOfDay.hour && nowTime.minute <= endTimeOfDay.minute);
  }
  bool isTimeBeforeEntry(TimeOfDay nowTime, TimeOfDay startTimeOfDay, TimeOfDay endTimeOfDay) {
    print("--- isTimeBeforeEntry: Сравнение времени ---"); // Начало метода

    print("  Текущее время (nowTime): $nowTime, Время начала занятия (startTimeOfDay): $startTimeOfDay"); // Значения времени

    if ((nowTime.hour < startTimeOfDay.hour) && isCurrentTimeInEntry(nowTime, startTimeOfDay, endTimeOfDay)) {
      print("  Условие: $nowTime.hour < $startTimeOfDay.hour  => TRUE (Часы текущего времени МЕНЬШЕ часов начала занятия)"); // Условие 1 и результат TRUE
      return true;
    } else {
      print("  Условие: $nowTime.hour < $startTimeOfDay.hour  => FALSE (Часы текущего времени НЕ МЕНЬШЕ часов начала занятия)"); // Условие 1 и результат FALSE
    }

    if (nowTime.hour == startTimeOfDay.hour && nowTime.minute < startTimeOfDay.minute) {
      print("  Условие: nowTime.hour == startTimeOfDay.hour && nowTime.minute < startTimeOfDay.minute  => TRUE (Часы равны, минуты текущего времени МЕНЬШЕ минут начала занятия)"); // Условие 2 и результат TRUE
      return true;
    } else {
      print("  Условие: nowTime.hour == startTimeOfDay.hour && nowTime.minute < startTimeOfDay.minute  => FALSE (Условие 2 не выполнено)"); 
    }

    print("  Ни одно из условий не выполнено, возвращаем FALSE");
    return false;
  }

isCurrentTimeInEntry ищет текущее занятие, в то время как isTimeBeforeEntry должно искать следующее. Если в первом if убрать && isCurrentTimeInEntry(nowTime, startTimeOfDay, endTimeOfDay), то будут выделяться все занятия сегодня позже текущего времени. Вот логика поиска следующей пары:

    ScheduleEntry? nextEntry;
    if (allEntriesForDay != null) {
      List<ScheduleEntry> futureEntries = [];
 // Проверяем, что есть список всех пар на день
    for (final otherEntry in allEntriesForDay) {
      if (otherEntry == entry) continue; // Пропускаем текущую пару

      final otherEntryStartTime = _parseTime(otherEntry.startTime);
      if (otherEntryStartTime != null) {
        final otherEntryStartTimeOfDay = TimeOfDay(hour: otherEntryStartTime.hour, minute: otherEntryStartTime.minute);

        if (isTimeBeforeEntry(nowTime, otherEntryStartTimeOfDay, entryEndTimeOfDay)) {
          nextEntry = otherEntry;
          break;
        }
        if (isTimeAfterNow(otherEntryStartTimeOfDay, nowTime)) {
          nextEntry = otherEntry;
        break;
          }
        }

        futureEntries.sort((a, b) {
          final startTimeA = _parseTime(a.startTime);
          final startTimeB = _parseTime(b.startTime);
          if (startTimeA == null || startTimeB == null) return 0;
          return startTimeA.hour.compareTo(startTimeB.hour) != 0 ? startTimeA.hour.compareTo(startTimeB.hour) : startTimeA.minute.compareTo(startTimeB.minute);
        });

        if (futureEntries.isNotEmpty) {
          nextEntry = futureEntries.first; // Начинаем с первой пары из списка
          for (final otherNextEntry in futureEntries.skip(1)) { // Перебираем остальные, начиная со второй
            final otherNextEntryStartTime = _parseTime(otherNextEntry.startTime);
            final currentNextEntryStartTime = _parseTime(nextEntry!.startTime); // nextEntry точно не null, т.к. futureEntries не пустой

            if (otherNextEntryStartTime != null && currentNextEntryStartTime != null) { // Строка 103 - Проверка на null
              // --- Упрощенное условное выражение (как и в прошлый раз) ---
              int otherEntryHour = otherNextEntryStartTime?.hour ?? 0;
              int currentNextEntryHour = currentNextEntryStartTime?.hour ?? 0;
              int otherEntryMinute = otherNextEntryStartTime?.minute ?? 0;
              int currentNextEntryMinute = currentNextEntryStartTime?.minute ?? 0;

              bool isHourEarlier = otherEntryHour < currentNextEntryHour;
              bool isHourEqual = otherEntryHour == currentNextEntryHour;
              bool isMinuteEarlier = otherEntryMinute < currentNextEntryMinute;

              if (isHourEarlier || (isHourEqual && isMinuteEarlier)) { 
                // Если время начала ТЕКУЩЕЙ пары из futureEntries РАНЬШЕ, чем время начала уже найденной "ближайшей" (nextEntry),
                // то ТЕКУЩАЯ пара становится новой "ближайшей" (nextEntry = otherNextEntry)
                nextEntry = otherNextEntry;
              }
            }
          }
        }
        if (nextEntry == entry) {
          return ScheduleEntryStatus.next;
        }
      }
    }

Так вот, можно ли изменить логику поиска следующей пары так, чтобы она только одну пару, даже если часы не совпадают? Если нет, то можно ли создать внешнюю переменную, которая будет отражать наличие следующей пары, чтобы потом не искать другую следующую пару? Скрины программы: Выделена текущая пара и следующая, хотя должна быть выделена только текущая Не выделяется следующая пара, если текущий час и час начала занятия не совпадают Вот что будет, если убрать из условия "&& isCurrentTimeInEntry(nowTime, startTimeOfDay, endTimeOfDay)"


Ответы (0 шт):