У меня есть провайдер, у которого есть список задач, бывает, я хочу реализовать способ, при котором через определенное время я хотел бы удалить задачу из списка.
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);
});
}
Моя идея состоит в том, чтобы изменить различные вещи в списке задач, например, удалить их, обновить статус задачи и т. д. Все эти данные поступают от моего провайдера.





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 уведомляет о новой задаче и она имеет имя «задача» или что-то в этом роде, вы можете очистить своего провайдера и использовать его для любого количества задач и входных данных, которые вы пожелаете.