Can Timer.periodic wait for fn return + fixed duration b4 next cycle?

I am using Timer.periodic with a duration of 5 seconds to make network calls. These calls usually take no longer than 500ms. I want to reduce the frequency of the timer to 2 seconds, but the callback could take up to 10 seconds in some cases. Is there a way to set a timer with a maximum duration of 1 second, plus the time taken by the callback? Or is there a better way to achieve this?

One way to achieve this is to use Future.delayed instead of Timer.periodic. You can set the delay time to 2 seconds and then use Future.timeout to make sure that the callback doesn’t take longer than 1 second. Here’s an example:

import 'dart:async';

void main() {
  startTimer();
}

void startTimer() {
  Future.delayed(Duration(seconds: 2)).then((_) {
    makeNetworkCall().timeout(Duration(seconds: 1), onTimeout: () {
      // Handle timeout
      print('Network call timed out');
      startTimer();
    }).then((result) {
      // Handle success
      print('Network call succeeded');
      startTimer();
    }).catchError((error) {
      // Handle error
      print('Network call failed: $error');
      startTimer();
    });
  });
}

Future<String> makeNetworkCall() {
  return Future.delayed(Duration(milliseconds: 700), () {
    return 'Result';
  });
}

In this example, makeNetworkCall simulates a network call that takes 700ms. The Future.timeout method is used to make sure that the callback doesn’t take longer than 1 second. If the callback takes longer than 1 second, the timeout function will be called and the timer will start again. If the callback succeeds or fails within 1 second, the timer will start again after the network call is complete.