【问题标题】:Can't execute async method in Background with workmanager无法使用 workmanager 在后台执行异步方法
【发布时间】:2020-11-12 03:41:26
【问题描述】:

在我的应用程序中,我需要在后台执行一些任务(而应用程序没有在前台运行)。我可以在后台执行一些方法,但是我需要在后台执行一个我不能执行的异步方法。

这是我的代码的一部分:

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();
    }
  }

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

}

【问题讨论】:

  • 你能解释一下你所说的“不工作”是什么意思吗?为什么你不等待你的异步方法?
  • 不工作意味着它没有被执行。
  • 您启动它,然后不再等待它,而是立即告诉您的呼叫者您已完成。我不希望它在这种情况下完全执行。
  • 那么解决办法是什么?

标签: flutter dart async-await background-process


【解决方案1】:

您需要等待让您的方法真正完成:

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

您的manager 方法可能应该返回Future&lt;void&gt;,因为它是async

如果您不确定如何使用Future 数据,请随时查看here

【讨论】:

  • 我使用了同样的技术,但是回调不是在等待 await 方法,而是通过它来结束方法执行,你知道吗?
  • 不是真的,对不起,我不知道你的代码。您应该针对您的特定代码和问题提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2020-10-25
  • 2015-07-05
相关资源
最近更新 更多