【问题标题】:"MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite)" when i use floor database“MissingPluginException(在通道 com.tekartik.sqflite 上找不到方法 getDatabasesPath 的实现)”当我使用楼层数据库时
【发布时间】:2020-11-03 11:46:39
【问题描述】:

我正在尝试使用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      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

floor、floor_generator 和 build_runner 的版本如下:

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

ma​​in.dart 中,我使用 $FloorAppDatabase 构建我的数据库:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  var db = await $FloorAppDatabase.databaseBuilder('mydb.db').build();
  runApp(MyApp(db));
}

在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());
  }
}

MainActivity.kt

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"))

    }

}

【问题讨论】:

    标签: database flutter sqflite floor


    【解决方案1】:

    这是由于新添加的依赖项造成的,在我的情况下,以下命令有效。 转到终端,然后

    flutter clean
    

    然后重新运行项目

    【讨论】:

    • 这解决了我同样的问题
    【解决方案2】:

    我终于找到了答案。 我必须在我的 MainActivity 中添加 Sqflite 插件:SqflitePlugin.registerWith(registrarFor("com.tekartik.sqflite.SqflitePlugin"))

    我的 MainActivity 更改如下:

    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"))
    
        }
    
    }
    
    

    【讨论】:

    • 这会引发错误:Unresolved reference: registrarFor。如何解决这个问题?
    【解决方案3】:

    如果您仅在发布版本中遇到此问题,请使用 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
    

    【讨论】:

    • 这是唯一对我有用的东西!谢谢!你刚刚拯救了我的一天。虽然我仍然不明白为什么它会起作用......
    • Gradle 上的内置代码收缩器混淆了一些类并删除了一些死代码。内置代码收缩器也删除了第三方插件的类。出于这个原因,我们必须添加 proguard-rules 以防止混淆我们的第三方插件的类。
    • 你让我开心了 :) 我遇到了同样的问题,这解决了它。谢谢!
    【解决方案4】:
    flutter clean
    flutter run
    

    这对我有用。

    【讨论】:

      【解决方案5】:

      我会尝试几件事:

      • 首先通过尝试使用 SharedPreferences 而不是 sqflite 来确保确实注册了所有插件
      • 如果您的应用不是最近创建的,请遵循插件迁移指南:https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration
      • 尝试删除 onCreate 中的 ImagePickerPlugin 注册(或者基本上摆脱 MainActivity 中的 onCreate)。
      • 尝试删除android文件夹并重新创建项目

      【讨论】:

        【解决方案6】:

        就我而言,我已完成以下步骤以使其正常工作:

        • 在您拥有 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 清单文件并提供您的应用程序类。
        <application
                android:name=".MyApp"
        
        • 现在清理并运行项目。

        【讨论】:

          【解决方案7】:

          不要使用 HotReload / Run,而是停止应用程序并重新启动。

          【讨论】:

            【解决方案8】:

            我真傻,我在 Chrome 中尝试运行我的 sqflite 应用程序时遇到了这个错误。当然sqflite 不支持网络,所以我不应该对它抛出错误感到惊讶!在移动模拟器(或 macos)中运行应该可以工作。 ??

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-10-20
              • 2023-03-20
              • 2021-12-17
              • 2020-08-14
              • 1970-01-01
              • 2021-11-25
              • 2021-12-21
              • 2020-12-09
              相关资源
              最近更新 更多