&引用;MissingPluginException(在channel com.tekartik.sqflite上找不到getDatabasesPath方法的实现)";当我使用楼层数据库时

&引用;MissingPluginException(在channel com.tekartik.sqflite上找不到getDatabasesPath方法的实现)";当我使用楼层数据库时,database,flutter,sqflite,floor,Database,Flutter,Sqflite,Floor,我正在尝试使用数据库,但当我想建立数据库时,我得到以下错误: E/flutter (26007): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite) E/flutter (26007): #0

我正在尝试使用数据库,但当我想建立数据库时,我得到以下错误:

E/flutter (26007): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite)
E/flutter (26007): #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:154:7)
E/flutter (26007): <asynchronous suspension>
E/flutter (26007): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:329:12)
E/flutter (26007): #2      invokeMethod (package:sqflite/src/sqflite_impl.dart:17:13)
E/flutter (26007): #3      SqfliteDatabaseFactoryImpl.invokeMethod (package:sqflite/src/factory_impl.dart:82:7)
E/flutter (26007): #4      SqfliteDatabaseFactoryMixin.safeInvokeMethod.<anonymous closure> (package:sqflite_common/src/factory_mixin.dart:25:35)
E/flutter (26007): #5      wrapDatabaseException (package:sqflite/src/exception_impl.dart:7:32)
E/flutter (26007): #6      SqfliteDatabaseFactoryImpl.wrapDatabaseException (package:sqflite/src/factory_impl.dart:78:7)
E/flutter (26007): #7      SqfliteDatabaseFactoryMixin.safeInvokeMethod (package:sqflite_common/src/factory_mixin.dart:25:7)
E/flutter (26007): #8      SqfliteDatabaseFactoryMixin.getDatabasesPath (package:sqflite_common/src/factory_mixin.dart:143:26)
E/flutter (26007): #9      getDatabasesPath (package:sqflite/sqflite.dart:168:54)
E/flutter (26007): #10     DatabaseFactoryExtension.getDatabasePath (package:floor/src/sqflite_database_factory.dart:23:23)
E/flutter (26007): #11     _$AppDatabaseBuilder.build (package:fluttermiwallet/db/database.g.dart:46:40)
E/flutter (26007): #12     main (package:fluttermiwallet/main.dart:9:67)
E/flutter (26007): #13     _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:241:25)
E/flutter (26007): #14     _rootRun (dart:async/zone.dart:1184:13)
E/flutter (26007): #15     _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter (26007): #16     _runZoned (dart:async/zone.dart:1619:10)
E/flutter (26007): #17     runZonedGuarded (dart:async/zone.dart:1608:12)
E/flutter (26007): #18     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:233:5)
E/flutter (26007): #19     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
E/flutter (26007): #20     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

地板、地板生成器和构建运行程序的版本如下:

Flutter 1.17.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 8af6b2f038 (13 days ago) • 2020-06-30 12:53:55 -0700
Engine • revision ee76268252
Tools • Dart 2.8.4
environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^0.1.3
  floor: ^0.13.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  floor_generator: ^0.13.0
  build_runner: ^1.7.3

在android文件夹GeneratedPluginRegistrant.java中:

package io.flutter.plugins;

import androidx.annotation.Keep;
import androidx.annotation.NonNull;

import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry;

/**
 * Generated file. Do not edit.
 * This file is generated by the Flutter tool based on the
 * plugins that support the Android platform.
 */
@Keep
public final class GeneratedPluginRegistrant {
  public static void registerWith(@NonNull FlutterEngine flutterEngine) {
    ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine);
      io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin.registerWith(shimPluginRegistry.registrarFor("io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin"));
    flutterEngine.getPlugins().add(new io.flutter.plugins.imagepicker.ImagePickerPlugin());
    flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
    flutterEngine.getPlugins().add(new io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin());
    flutterEngine.getPlugins().add(new com.tekartik.sqflite.SqflitePlugin());
  }
}
import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugins.imagepicker.ImagePickerPlugin


class MainActivity : FlutterActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ImagePickerPlugin.registerWith(
                registrarFor("io.flutter.plugins.imagepicker.ImagePickerPlugin"))

    }

}
MainActivity.kt

package io.flutter.plugins;

import androidx.annotation.Keep;
import androidx.annotation.NonNull;

import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry;

/**
 * Generated file. Do not edit.
 * This file is generated by the Flutter tool based on the
 * plugins that support the Android platform.
 */
@Keep
public final class GeneratedPluginRegistrant {
  public static void registerWith(@NonNull FlutterEngine flutterEngine) {
    ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine);
      io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin.registerWith(shimPluginRegistry.registrarFor("io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin"));
    flutterEngine.getPlugins().add(new io.flutter.plugins.imagepicker.ImagePickerPlugin());
    flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
    flutterEngine.getPlugins().add(new io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin());
    flutterEngine.getPlugins().add(new com.tekartik.sqflite.SqflitePlugin());
  }
}
import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugins.imagepicker.ImagePickerPlugin


class MainActivity : FlutterActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ImagePickerPlugin.registerWith(
                registrarFor("io.flutter.plugins.imagepicker.ImagePickerPlugin"))

    }

}

我会尝试几种方法:

  • 首先,通过尝试使用SharedReferences而不是sqflite来确保所有插件都已注册
  • 遵循插件迁移指南:如果你的应用程序不是最近创建的
  • 尝试在onCreate中删除ImagePickerPlugin注册(或者基本上在MainActivity中删除onCreate)
  • 尝试删除android文件夹并再次创建项目

    • 我终于找到了答案我必须在我的主要活动中添加Sqflite插件:
      SqflitePlugin.registerWith(registerFor(“com.tekartik.Sqflite.SqflitePlugin”)

      我的主要活动更改如下:

      import android.os.Bundle
      import io.flutter.app.FlutterActivity
      import io.flutter.plugins.imagepicker.ImagePickerPlugin
      import com.tekartik.sqflite.SqflitePlugin
      
      
      class MainActivity : FlutterActivity() {
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              ImagePickerPlugin.registerWith(
                      registrarFor("io.flutter.plugins.imagepicker.ImagePickerPlugin"))
              SqflitePlugin.registerWith(registrarFor("com.tekartik.sqflite.SqflitePlugin"))
      
          }
      
      }
      
      

      这种情况是由于新添加的依赖项造成的,在我的例子中,下面的命令可以工作。 到终点站,然后

      flutter clean
      

      然后重新运行该项目

      在我的例子中,我已经完成了以下步骤使其正常工作:

      • 在拥有MainActivity的同一软件包中为android创建应用程序类(如果尚未创建)
      MyApp.kt

      package com.example.flutter_example
      
      import io.flutter.app.FlutterApplication;
      import io.flutter.plugin.common.PluginRegistry;
      import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
      import com.tekartik.sqflite.SqflitePlugin
      
      class MyApp : FlutterApplication(), PluginRegistrantCallback {
      
          override fun registerWith(registry: PluginRegistry) {
              com.tekartik.sqflite.SqflitePlugin.registerWith(
                      registry.registrarFor("com.tekartik.sqflite.SqflitePlugin"))
          }
      }
      
      • 现在更新Android清单文件并提供应用程序类
      
      
      这对我来说很有效。

      如果你只在发布版本中遇到这个问题,那么就用proguard规则构建你的发布应用程序

          buildTypes {
              release {
                  signingConfig signingConfigs.debug
                  minifyEnabled true
                  useProguard true
                  proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
              }
          }
      
      在目录
      android/app/
      上创建一个文件,将该文件命名为
      proguard rules.pro
      ,并在其中写入:

      #Flutter Wrapper
      -keep class io.flutter.app.** { *; }
      -keep class io.flutter.plugin.**  { *; }
      -keep class io.flutter.util.**  { *; }
      -keep class io.flutter.view.**  { *; }
      -keep class io.flutter.**  { *; }
      -keep class io.flutter.plugins.**  { *; }
      -keep class androidx.lifecycle.DefaultLifecycleObserver
      

      不要使用热重新加载/运行,而是停止应用程序并重新启动。

      感谢您的回答Alex:)这现在会引发错误:
      未解析的引用:registerFor
      。如何解决这个问题?这是唯一对我有效的方法!谢谢你刚刚救了我一天。虽然我仍然不明白它为什么会工作……Gradle上的内置代码收缩器会混淆一些类并删除一些死代码。内置代码收缩器也删除了第三方插件的类。出于这个原因,我们必须添加proguard规则来防止第三方插件类的混淆。
      #Flutter Wrapper
      -keep class io.flutter.app.** { *; }
      -keep class io.flutter.plugin.**  { *; }
      -keep class io.flutter.util.**  { *; }
      -keep class io.flutter.view.**  { *; }
      -keep class io.flutter.**  { *; }
      -keep class io.flutter.plugins.**  { *; }
      -keep class androidx.lifecycle.DefaultLifecycleObserver