我用bloc,用repository pattern.需要根据时间表在后台执行代码,为此我使用workmanager.问题是workmanager在单独的方法中执行,该方法在main方法外部初始化,并且它不知道任何关于上下文或下面的代码(如MyApp)的信息

@pragma('vm:entry-point')
void callbackDispatcher() {
  Workmanager().executeTask((taskName, inputData) {
    
    //How i can access bloc or repository from here?
    return Future.value(true);
  });
}

无效Main()异步{

Workmanager().initialize(callbackDispatcher, isInDebugMode: true);
  Workmanager().registerPeriodicTask('uniqueName', 'taskName',
      constraints: Constraints(
        networkType: NetworkType.connected,
        requiresBatteryNotLow: true,
      ),
      frequency: const Duration(minutes: 5));


}

Workmanager是在main方法的最开始时初始化的,在runApp MyApp之前,它没有上下文,我的存储库和块甚至还没有创建.我想不出如何从工作管理器访问该区块.

推荐答案

您可以在注册周期任务时,将仓库和块的实例作为输入数据传递,然后在回调Dispatcher方法中进行访问:

final Repository _repository = Repository();
final Bloc _bloc = Bloc();

void main() async {
  Workmanager().initialize(callbackDispatcher, isInDebugMode: true);
  Workmanager().registerPeriodicTask('uniqueName', 'taskName',
      inputData: {'repository': _repository, 'bloc': _bloc},
      constraints: Constraints(
        networkType: NetworkType.connected,
        requiresBatteryNotLow: true,
      ),
      frequency: const Duration(minutes: 5));
  runApp(MyApp());
}

@pragma('vm:entry-point')
void callbackDispatcher() {
  Workmanager().executeTask((taskName, inputData) {
    final Repository repository = inputData['repository'];
    final Bloc bloc = inputData['bloc'];
    // Use repository and bloc as needed
    return Future.value(true);
  });
}

您还可以对存储库和阻塞类使用单例模式:

class Repository {
  static final Repository _singleton = Repository._internal();
  factory Repository() {
    return _singleton;
  }

  Repository._internal();
  // Repository methods
}

class Bloc {
  static final Bloc _singleton = Bloc._internal();
  factory Bloc() {
    return _singleton;
  }

  Bloc._internal();
  // Bloc methods
}

void main() async {
  Repository();
  Bloc();
  Workmanager().initialize(callbackDispatcher, isInDebugMode: true);
  Workmanager().registerPeriodicTask('uniqueName', 'taskName',
      constraints: Constraints(
        networkType: NetworkType.connected,
        requiresBatteryNotLow: true,
      ),
      frequency: const Duration(minutes: 5));
  runApp(MyApp());
}

@pragma('vm:entry-point')
void callbackDispatcher() {
  Workmanager().executeTask((taskName, inputData) {
    final Repository repository = Repository();
    final Bloc bloc = Bloc();
    // Use repository and bloc as needed
    return Future.value(true);
  });
}

Flutter相关问答推荐

Box约束强制无限高:SizedBox. Expand()

如何刷新future 的构建器时,没有OBS变量的内部在Ffltter?

我如何才能收到每天重复的预定通知?

MobX Build_Runner问题:不生成.G文件(Flutter )

Flutter 应用程序中的Firebase实时数据库中的orderByChild()不适用于我

导航回上一页会将我带回Ffltter应用程序中的登录页面

如何在 Flutter 中以背景 colored颜色 制作圆圈的一部分

flutter Listview构建器溢出

使用 flutter_svg 在 flutter 中的 Canvas 上绘制 SVG 图像

Flutter:使用 GlobalKey 访问 BlocProvider

模块是使用不兼容的 kotlin 版本编译的.其元数据的二进制版本是1.8.0,预期版本是1.6

Flutter Firebase 升级后出现问题? ARC 语义问题 (Xcode): Select 器appleCredentialWithIDToken:rawNonce:fullName:没有已知的类方法

Flutter / 为什么当我点击我的图片时我的模型没有更新?

我想在文本结束后显示分隔线.它会在第一行、第二行或第三行结束

如何修复 ICU Lexing 错误:Flutter 中的意外字符

在 Flutter 中使用 HardwareKeyboard 时所有键都没有响应

改变步进器的线条 colored颜色 Flutter

如何在 flutter 中过滤 DateTime(intl)?

如何在 ElevatedButton 上设置背景 colored颜色 动画?

如何在Flutter 的 initState 中初始化 Firestore 查询