Обновите внешние значения с помощью WorkManager

У меня есть провайдер, у которого есть список задач, бывает, я хочу реализовать способ, при котором через определенное время я хотел бы удалить задачу из списка.

class TaskProvider extends ChangeNotifier {
  final List<TaskModel> _tasks = [];
  List<TaskModel> get tasks => _tasks;
  final String _tasksKey = "tasks";

  Future<void> addTask({
    required String task,
    required DateTime scheduledTime,
    required TaskStatus status,
  }) async {
    scheduleTaskManager(task, scheduledTime);
    _tasks.add(
        TaskModel(task: task, limitDateTime: scheduledTime, status: status));
    notifyListeners();
  }

  Future<void> clearTasks() async {
    dev.log("Tasks deleted!");
    tasks.clear();
    notifyListeners();  
  }
}

Обычно я могу сделать это из пользовательского интерфейса, импортировав и вызвав функцию ClearTasks(), однако я не могу использовать это с WorkManager. Насколько я понимаю, процессы WorkManager разделены.

Итак, я хочу спросить, какие существуют способы изменить внешнее значение с помощью WorkManager?

Это callbackDispatcher:

@pragma(
    'vm:entry-point') // Mandatory if the App is obfuscated or using Flutter 3.1+
void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) {
    dev.log(
        "Native called background task: $task"); //simpleTask will be emitted here.
    dev.log("Time limit, clearing all tasks!");
    //Call clearTasks() or find a way to be able to modify the list of tasks of TaskProvider.
    return Future.value(true);
  });
}

Хотя изначально я все равно пытался вызвать функцию ClearTasks(), я вижу журнал «Задачи удалены!» (журнал из TaskProvider.clearTasks)» в консоли, но в виджете, где я показываю список задач, я не вижу удаляемой задачи.

@pragma(
    'vm:entry-point') // Mandatory if the App is obfuscated or using Flutter 3.1+
void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) {
    dev.log(
        "Native called background task: $task"); //simpleTask will be emitted here.
    dev.log("Time limit, clearing all tasks!");
    TaskProvider taskProvider = TaskProvider();
    taskProvider.clearTasks();
    return Future.value(true);
  });
}

Моя идея состоит в том, чтобы изменить различные вещи в списке задач, например, удалить их, обновить статус задачи и т. д. Все эти данные поступают от моего провайдера.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TaskProvider, созданный в этой функции, отличается от экземпляра вашего провайдера. Поскольку функция должна быть верхнего уровня, возможно, вариантом будет создание статического ChangeNotifier, который работает как WorkManagerNotifier, отправляя сообщение всем, кто хочет обновить:

class WorkManagerNotifier extends ChangeNotifer {
  WorkManagerNotifier._();
  static final WorkManagerNotifier _instance = WorkManagerNotifier._();
  factory WorkManagerNotifier() => _instance;
  
  String? task;
  /// maybe an enum or bool to say is completed or failed  

  void updatedTask(String newTask) {
    task = newTask;
    notifiyListeners();
  }
}

@pragma(
    'vm:entry-point') // Mandatory if the App is obfuscated or using Flutter 3.1+
void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) {
    dev.log(
        "Native called background task: $task"); //simpleTask will be emitted here.
    dev.log("Time limit, clearing all tasks!");
    WorkManagerNotifier().updateTask(task); /// maybe you're interested in the data too?
    return Future.value(true);
  });
}

И теперь вы можете либо прослушивать WorkManagerNotifier внутри других ваших провайдеров, либо использовать его в своем контексте:

/// main

ChangeNotifierValue(
  value: WorkManagerNotifier()
  child: MaterialApp...
)


/// where you create your TaskProvider
ChangeNotifierProxyProvider<WorkManagerNotifier, TaskProvider>(
  create: (_) => TaskProvider(...), ///
  update: (_, workManager, taskProvider) {
    if (workManager.task == 'task') {
      taskProvider.clear();
    }
    return taskProvider;
  },
  child: ...
);

Теперь, когда Workmanager уведомляет о новой задаче и она имеет имя «задача» или что-то в этом роде, вы можете очистить своего провайдера и использовать его для любого количества задач и входных данных, которые вы пожелаете.

Другие вопросы по теме