Способен ли flutter (dart) сделать запрос API в отдельном изоляте?
Я сделал функцию для отправки уведомления в тему. Он отлично работает в обычном режиме, затем я помещаю его в функцию вычисления и надеюсь, что он может публиковать уведомления в фоновом режиме. Но это не работает. Вот мой код:
void onSendMessageInBackGround(String message) {
Future.delayed(Duration(milliseconds: 3000)).then((_) async{
Client client = Client();
final requestHeader = {'Authorization': 'key=my_server_key', 'Content-Type': 'application/json'};
var data = json.encode({
'notification': {
'body': 'tester',
'title': '$message',
},
'priority': 'high',
'data': {
'click_action': 'FLUTTER_NOTIFICATION_CLICK',
'dataMessage': 'test',
'time': "${DateTime.now()}",
},
'to': '/topics/uat'
});
await client.post('https://fcm.googleapis.com/fcm/send', headers: requestHeader, body: data);
});
}
Call Compute:
compute(onSendMessageInBackGround, 'abc');
Примечание: я поместил функцию onSendMessageInBackGround на верхний уровень моего приложения, как сказала библиотека
Это что-то упустило? или мы не можем этого сделать?
2 ответа
Вам может понадобиться добавить return
или же await
void onSendMessageInBackGround(String message) {
return /* await (with async above) */ Future.delayed(Duration(milliseconds: 3000)).then((_) async{
Может случиться так, что изолят отключится до того, как будет сделан запрос, потому что вы не ожидаете Future
Функция, вызываемая из compute, должна быть статической или глобальной.
Либо я согласен с pskink, вычислять здесь не полезно.
Изоляты общаются, передавая сообщения туда и обратно. Эти сообщения могут быть примитивными значениями, такими как null, num, bool, double или String, или простыми объектами, такими как List в этом примере.
Вы можете столкнуться с ошибками, если попытаетесь передать более сложные объекты, такие как Future или http.Response между изолятами.
Получил это из документации здесь