1

我在 StateFull Widget 中有一个名为 control 的函数。我想每 15 分钟用 WorkManager 运行这个函数。

如何从 callbackDispatcher 函数调用控制函数?我将 Stream 静态添加到 Statefull 小部件,然后收听它,但它不起作用。

HomeScreen.dart 文件

import 'package:flutter/material.dart';
import 'package:workmanager/workmanager.dart';

const taskKontrol = "control";

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }

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

  void control() async
  {
    //... my code control is here
  }

}

void setupWorkManager() async {
  await Workmanager.initialize(callbackDispatcher, isInDebugMode: true);
  Workmanager.registerPeriodicTask(taskKontrol, taskKontrol,
      frequency: Duration(seconds: 10),
      existingWorkPolicy: ExistingWorkPolicy.append
  );
}


void callbackDispatcher() {
  Workmanager.executeTask((taskName, inputData) async {
    switch(taskName)
    {
      case taskKontrol:
        // How can I call the control function from here?
        print("control from workmanager");
        break;
    }
    return Future.value(true);
  });
}
4

1 回答 1

1

对于那些仍在寻找答案的人:

来自官方文档:

callbackDispatcher 需要是静态函数或顶级函数才能作为 Flutter 入口点访问。

我有同样的问题,我通过将函数移动callbackDispatcher到文件来解决它:main.dart

此外,初始化代码callbackDispatcher必须在小部件加载main()之前。App()

要调用您的控制代码,请创建一个具有静态函数的类control()

注意:您不能从 callbackDispatcher 调用小部件的方法!

原因:小部件是 UI 绑定的。只要屏幕保持活动状态,可见的小部件就会保持活动状态。一旦您关闭应用程序或移至下一个屏幕,小部件的内存就会被回收。但是即使你的应用程序关闭,这个 callbackDispatcher 也会被执行。因此,它必须与 UI 代码隔离。

这是代码:

主要飞镖:

import 'package:flutter/material.dart';
import 'package:workmanager/workmanager.dart';


void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Workmanager().initialize(callbackDispatcher, isInDebugMode: true);
  runApp(App());
}

void callbackDispatcher() {
  Workmanager.executeTask((taskName, inputData) async {
    switch(taskName)
    {
      case ScheduledTask.taskName:
        ScheduledTask.control(); // calls your control code
        break;
    }
    return Future.value(true);
  });
}

class ScheduledTask {
  const static String taskName = "control";
  static void control() {
    // add your control here
  }
}

您可以从 HomeScreen 小部件中执行的所有操作就是调用setupWorkManager()来安排任务

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }

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

void setupWorkManager() async {
  Workmanager.registerPeriodicTask(taskKontrol, taskKontrol,
      frequency: Duration(minutes: 15),
      existingWorkPolicy: ExistingWorkPolicy.append
  );
}

注意:重复任务的最低频率为 15 分钟

于 2021-12-24T02:29:32.703 回答