使用 WorkManager 无法在后台执行异步方法

5
在我的应用程序中,我需要在后台执行一些任务(当应用程序未在前台运行时)。我能够在后台执行一些方法,但是,我需要在后台执行一个异步方法,但我无法这样做。
以下是我的代码的一部分:
void main() {
  runApp(MaterialApp(
    home: Home(),
  ));

  Workmanager.initialize(callbackDispatcher, isInDebugMode: true);
  Workmanager.registerPeriodicTask("1", "simplePeriodicTask",
      existingWorkPolicy: ExistingWorkPolicy.replace,
      frequency: Duration(minutes: 15),
      initialDelay:
          Duration(seconds: 5),
      constraints: Constraints(
        networkType: NetworkType.connected,
      ));
}

void callbackDispatcher() {
  Workmanager.executeTask((task, inputData) {
    _HomeState().manager();//This is not Working
    print('Background Services are Working!');//This is Working
    return Future.value(true);
  });
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {

  @override
  void initState() {
    login();
    super.initState();
  }

  void manager() async {
    if (account == null) {
      await login();
      await managerLocal();
      managerDrive();
    } else {
      await managerLocal();
      managerDrive();
    }
  }

  .......
  .......

}

你能解释一下“不起作用”的意思以及为什么不等待异步方法吗? - nvoigt
不工作意味着它没有被执行。 - Santo Shakil
你开始它,然后立即告诉调用者你已经完成,我不会期望它在这种情况下完全执行。 - nvoigt
那么解决方案是什么? - Santo Shakil
@nvoigt 有什么解决方案吗?我也遇到了同样的问题。 - sunilkumar
1个回答

4

你需要等待方法实际完成:

void callbackDispatcher() {
  Workmanager.executeTask((task, inputData) async {
    await _HomeState().manager();
    print('Background Services are Working!');//This is Working
    return true;
  });
}

您的manager方法应该返回一个Future<void>,因为它是async

如果您不确定如何处理Future数据,请随时查看此处


我使用了相同的技术,但回调函数没有等待 await 方法,而是直接将其传递以结束方法执行,对此有什么想法吗? - Muhammed Refaat
不好意思,我不知道你的代码。你应该就你具体的代码和问题提出一个新的问题。 - nvoigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接