Flutter: использование поставщика пути, когда приложение находится в фоновом режиме

В настоящее время я пытаюсь внедрить FCM и локальные уведомления в свое приложение Flutter. Я успешно настроил FCM и локальные уведомления для обычных уведомлений, но у меня также есть другой тип уведомления, который я хотел бы отображать с изображением. Когда мое приложение находится на переднем плане, уведомление отображается без ошибок, однако, когда я завершаю приложение / переместить его в фоновый режим. Я получаю исключение при попытке сохранить изображение с помощью поставщика пути.

Исключение:

MissingPluginException(No implementation found for method getApplicationDocumentsDirectory on channel plugins.flutter.io/path_provider)

Я предполагаю, что эта ошибка возникает из-за того, что канал метода поставщика пути закрыт, когда приложение не находится на переднем плане. Могу ли я что-то сделать, чтобы это исправить? Или если неflutter_local_notificationsплагину требуется путь к файлу растрового изображения. Могу ли я сохранить изображение и получить путь другим способом, который будет работать в фоновом режиме (без поставщика пути)? (На самом деле я хотел бы отобразить изображение из такой ссылки: https://is1-ssl.mzstatic.com/image/thumb/WNUBiv2P6YSklHn9eA5nlg/1000x1000bb.jpeg)

Сохранение изображения:

 static Future<String> saveImage(Image image) {
    final completer = Completer<String>();
    image.image.resolve(ImageConfiguration()).addListener(ImageStreamListener((imageInfo,_) async {
      final byteData = await imageInfo.image.toByteData(format: ImageByteFormat.png);
      final pngBytes = byteData.buffer.asUint8List();
      final fileName = pngBytes.hashCode;
      final directory = await getApplicationDocumentsDirectory();
      final filePath = '${directory.path}/$fileName';
      final file = File(filePath);
      await file.writeAsBytes(pngBytes);
      completer.complete(filePath);
    }));
    return completer.future;
  }

2 ответа

Решение

Вам также необходимо зарегистрировать поставщика пути в Application.java.

import io.flutter.plugins.pathprovider.PathProviderPlugin;

...

    @Override
    public void registerWith(PluginRegistry registry) {
PathProviderPlugin.registerWith(registry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin"));
    }

Эта ошибка возникла из-за того, что вы не зарегистрировали подключение флаттера в Android MainAcitivity.

Ваш должны изменить OnCreate метод вашего MainActivity, как показано ниже:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this.getFlutterEngine());
}
Другие вопросы по тегам