未在通道 plugins.flutter.io/path_provider 上找到方法 getApplicationDocumentsDirectory 的实现

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

我的 Flutter 应用程序在初始屏幕上冻结,我收到以下错误日志:

Built build\app\outputs\apk\debug\app-debug.apk.
I/Choreographer(18870): Skipped 75 frames!  The application may be doing too much work on its main thread.
D/EGL_emulation(18870): eglMakeCurrent: 0xe8885480: ver 3 0 (tinfo 0xe88835a0)
I/OpenGLRenderer(18870): Davey! duration=2142ms; Flags=1, IntendedVsync=65263803118670, Vsync=65265053118620, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=65265065657900, AnimationStart=65265065738100, PerformTraversalsStart=65265065780200, DrawStart=65265126086300, SyncQueued=65265197367200, SyncStart=65265199471900, IssueDrawCommandsStart=65265199680700, SwapBuffers=65265651453000, FrameCompleted=65265947767800, DequeueBufferDuration=12659000, QueueBufferDuration=920000,
Syncing files to device Android SDK built for x86...
E/flutter (18870): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: MissingPluginException(No implementation found for method getApplicationDocumentsDirectory on channel plugins.flutter.io/path_provider)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:314:7)
Syncing files to device Android SDK built for x86...
E/flutter (18870): <asynchronous suspension>
Syncing files to device Android SDK built for x86...
E/flutter (18870): #1      getApplicationDocumentsDirectory (package:path_provider/path_provider.dart:84:22)
Syncing files to device Android SDK built for x86...
E/flutter (18870): <asynchronous suspension>
Syncing files to device Android SDK built for x86...
E/flutter (18870): #2      DbContext.initDb (package:appentrega/database.dart:34:45)
Syncing files to device Android SDK built for x86...
E/flutter (18870): <asynchronous suspension>
Syncing files to device Android SDK built for x86...
E/flutter (18870): #3      DbContext.getContext (package:appentrega/database.dart:27:21)
Syncing files to device Android SDK built for x86...
E/flutter (18870): <asynchronous suspension>
Syncing files to device Android SDK built for x86...
E/flutter (18870): #4      _SplashScreenState.startTime (package:appentrega/splash.dart:16:34)
Syncing files to device Android SDK built for x86...
E/flutter (18870): <asynchronous suspension>
Syncing files to device Android SDK built for x86...
E/flutter (18870): #5      _SplashScreenState.initState (package:appentrega/splash.dart:33:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #6      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4068:58)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #7      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3919:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #8      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #9      Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #10     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5127:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #11     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #12     Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #13     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3961:16)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #14     Element.rebuild (package:flutter/src/widgets/framework.dart:3738:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #15     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3924:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #16     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3919:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #17     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #18     Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #19     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5127:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #20     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #21     Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #22     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5127:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #23     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #24     Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #25     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5127:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #26     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #28     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5127:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #29     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #30     Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #31     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3961:16)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #32     Element.rebuild (package:flutter/src/widgets/framework.dart:3738:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #33     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3924:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #34     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4088:11)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #35     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3919:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #36     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #37     Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #38     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3961:16)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #39     Element.rebuild (package:flutter/src/widgets/framework.dart:3738:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #40     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3924:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #41     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3919:5)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3101:14)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2904:12)
Syncing files to device Android SDK built for x86...
E/flutter (18870): #44
Syncing files to device Android SDK built for x86...
D/EGL_emulation(18870): eglMakeCurrent: 0xe8885720: ver 3 0 (tinfo 0xe88832f0)
Syncing files to device Android SDK built for x86...
 4.034ms (!)

看起来问题出在这里: [错误:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常:MissingPluginException(未在通道 plugins.flutter.io/path_provider 上找到方法 getApplicationDocumentsDirectory 的实现)

已经完成:

-删除所有插件并重新安装flutter pub get
-运行了 flutter cleanflutter run

此错误通常发生在您获得插件但未再次构建应用程序时。如果在 pubspec.yaml 上安装插件后出现这种情况,请重新安装您的 apk。如果这不是您的问题,您是否创建了支持 kotlin 和 swift 的项目?我不知道是不是这种情况,但大多数插件都需要这个

原来我不得不退出 flutter 运行 进程并重新启动它。只是在 flutter 运行 中完全重启没有用。

这里有一个link供参考https://github.com/flutter/flutter/issues/10912

编辑:确保导入这些包;

  1. 包:path_provider/path_provider.dart
  2. 飞镖:io
  3. 飞镖:异步

在我的例子中是为了缓存,我删除了 cached_network_image 并将其替换为 Image.network,问题消失了

就我而言,我没有包含 dart:async 包。 运行“flutter 运行”并包含“dart:async”包解决了问题

在构建发布 apk 后,我在另一个插件上遇到了这个错误, 这是因为默认情况下启用代码收缩 - 如果您不想 minify/obfuscate 代码,只需在 android/app/build.gradle.

中添加两行
android {
    ...

    buildTypes {
        release {
            ...
         
            shrinkResources false
            minifyEnabled false
        }
    }
}

就我而言,我的 AndroidManifest.xml 文件中缺少以下代码段。

        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />

将其添加到 AndroidManifest.xml 文件中解决了问题。

Upgrading-pre-1.12-Android-projects之后!!

如果您没有太多时间尝试编辑步骤 5AppDelegate.h

我按照指南更新后通过了:Upgrading-pre-1.12-Android-projects 应用以下操作:

  1. 将 flutter 更新到最新的稳定版本 -> flutter clean 丢失

  2. 更新你所有的依赖(很可能是packages有或者要求你添加新的方法)-> flutter clean不过分

  3. 更新包更新产生的代码和方法

  4. 尝试 flutter 运行 或从 android Studio |>(某些软件包可能会向您发送 missingPluginException 但如果它安装在移动设备上)转到第 5 步。

  5. 如果可以的话,为 android 和 IOS 构建测试安装(它们应该可以正常工作)。 很可能在使用 flutter 运行 进行开发时它会继续发送错误,在我的情况下我无法在 IOS 中进行测试,但是对于 flutter 运行 它 运行s 运行s android 和 IOS 并通过将其添加到 ios / Runner / AppDelegate.h ->[GeneratedPluginRegistrant registerWithRegistry: self];

    来解决问题

    #import <颤动/Flutter.h> #import

    @interface AppDelegate:FlutterAppDelegate [GeneratedPluginRegistrant registerWithRegistry: self]; @EnD

如果在这些步骤之后无法在步骤 4 0 5 中执行,请验证其他依赖项是否未更新其版本以与 Upgrading-pre-1.12-Android-projects ! 兼容。例如 cached_network_image 使用 path_provider 尝试卸载 cached_network_image 包 再次从第 4 步开始重复。

Web 版 Flutter

我 运行 在开始向应用程序添加 Web 支持后进入此状态。 getApplicationDocumentsDirectory() 函数仅支持 iOS 和 Android (docs)。我添加了一个 web 检查并更改了我设置目录的方式,这为我修复了“未找到方法的实现”。

判断平台是否为 web 使用 Flutter 的 kIsWeb:

import 'package:flutter/foundation.dart' show kIsWeb;

然后相应地处理设置目录:

if (kIsWeb) {
    // Set web-specific directory
} else {
    appDocumentDirectory = await path_provider.getApplicationDocumentsDirectory();
}

对我有用的是在Application.java(或Application.kt)中注册相应的插件方法通道。所以是这样的:

package com.example.lifely;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.pathprovider.PathProviderPlugin;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
  @Override
  public void registerWith(PluginRegistry registry) {
    PathProviderPlugin.registerWith(registry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin"));
  }
}

您只需要重新安装应用程序

您可以使用 https://pub.dev/packages/permission_handler 运行时

管理权限

通常,当您在 AndroidManifest.xml 文件中提到权限时,它会在应用程序首次启动时请求权限,这就是为什么您需要重新安装应用程序或从权限管理器授予权限,或者您可以从您的应用程序动态使用以上套餐

如果你的包依赖于flutter_facebook_auth, you need to make sure you have performed the setup for Android和iOS来摆脱这个错误。我正在使用 Hive 和 Facebook 登录,令人惊讶的是,缺少 Facebook 设置导致 Hive.initFlutter() 抛出此错误。

即使您实际上没有在您的 Facebook 开发者帐户上设置 Facebook 应用程序,此修复程序仍然有效。

Flutter MacOS 桌面应用程序 上使用 cached_network_image 时出现此错误 - 认为这是由 2.0. path_provider 包的 0 个更新:

我认为是因为 cached_network_image 使用的 path_provider 函数 (getTemporaryDirectory()) 没有在桌面上定义路径,这导致它抛出错误。

为了解决这个问题(在我的例子中),我导入了 path_provider_macos 包(https://pub.dev/packages/path_provider_macos)并在我的应用程序启动之前在 main 中注册了它。

void main() {
  PathProviderMacOS.registerWith();
  runApp(MyApp());
}

我还没有测试过其他平台,但是存在 linux (https://pub.dev/packages/path_provider_linux) and windows (https://pub.dev/packages/path_provider_windows) 的软件包,所以应该也能解决这些平台上的问题。

由于 Flutter 团队正在 Dart plugin registration doesn't run in background isolates #98591 中采用 in-package 平台通道在更多的 1P 插件中,这需要注册 Dart 插件,因此插件在 Isolates 中无法使用框,完成后工作仍在进行中你需要将DartPluginRegistrant.ensureInitialized()初始化为WidgetsFlutterBinding.ensureInitialized()之前。

在那之前,有一个解决方法。 #99155

那里描述的解决方法也适用于 path_provider

添加对 path_provider_androidpath_provider_ios 的依赖。 在后台隔离入口点的开头,添加如下内容:

if (Platform.isAndroid) PathProviderAndroid.registerWith();
if (Platform.isIOS) PathProviderIOS.registerWith();