Flutter:应用程序在后台运行时使用路径提供程序

时间:2020-06-28 14:16:21

标签: image flutter notifications firebase-cloud-messaging flutter-method-channel

我目前正在尝试在我的Flutter应用中实施FCM和本地通知。我已经为常规通知成功配置了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 个答案:

答案 0 :(得分:3)

您还需要在Application.java中注册路径提供程序。

import io.flutter.plugins.pathprovider.PathProviderPlugin;

...

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

现在,Flutter使用Kotlin作为android端的默认语言,这是Kotlin代码:

override fun registerWith(registry: PluginRegistry) {
    io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
    PathProviderPlugin.registerWith(registry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin"))
}

答案 1 :(得分:0)

发生此错误是因为您没有在Android MainAcitivity中注册颤振插入。

您必须更改 MainActivity onCreate 方法,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this.getFlutterEngine());
}