"MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite)" 当我使用地板数据库时
"MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite)" when i use floor database
我正在尝试使用 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版本:
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
在 main.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"))
}
}
我会尝试几种方法:
- 首先通过尝试使用 SharedPreferences 而不是 sqflite 来确保所有插件确实已注册
- 遵循插件迁移指南:https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration如果您的应用不是最近创建的
- 尝试在 onCreate 中删除 ImagePickerPlugin 注册(或者基本上去掉 MainActivity 中的 onCreate)。
- 尝试删除android文件夹并重新创建项目
我终于找到了答案。 我必须在我的 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"))
}
}
这是由于新添加的依赖项导致的,在我的例子中,以下命令起作用了。
去终端然后
flutter clean
并重新 运行 项目
就我而言,我已完成以下步骤以使其正常工作:
- 在您拥有 MainActivity 的同一包中为 android 创建应用程序 class(如果尚未创建)。
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 清单文件并提供您的应用程序 class。
<application
android:name=".MyApp"
- 现在清理 运行 项目。
flutter clean
flutter run
这对我有用。
如果您仅在发布版本时遇到此问题,请使用混淆规则构建您的发布应用程序
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
不使用 HotReload / 运行,停止应用程序并重新启动。
愚蠢的我,我在 Chrome 中尝试 运行 我的 sqflite 应用程序时 运行 遇到了这个错误。当然 sqflite 不支持网络,所以我不应该对它抛出错误感到惊讶! 运行 在移动模拟器(或 macOS)中应该可以工作。
我正在尝试使用 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版本:
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
在 main.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"))
}
}
我会尝试几种方法:
- 首先通过尝试使用 SharedPreferences 而不是 sqflite 来确保所有插件确实已注册
- 遵循插件迁移指南:https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration如果您的应用不是最近创建的
- 尝试在 onCreate 中删除 ImagePickerPlugin 注册(或者基本上去掉 MainActivity 中的 onCreate)。
- 尝试删除android文件夹并重新创建项目
我终于找到了答案。 我必须在我的 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"))
}
}
这是由于新添加的依赖项导致的,在我的例子中,以下命令起作用了。 去终端然后
flutter clean
并重新 运行 项目
就我而言,我已完成以下步骤以使其正常工作:
- 在您拥有 MainActivity 的同一包中为 android 创建应用程序 class(如果尚未创建)。
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 清单文件并提供您的应用程序 class。
<application
android:name=".MyApp"
- 现在清理 运行 项目。
flutter clean
flutter run
这对我有用。
如果您仅在发布版本时遇到此问题,请使用混淆规则构建您的发布应用程序
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
不使用 HotReload / 运行,停止应用程序并重新启动。
愚蠢的我,我在 Chrome 中尝试 运行 我的 sqflite 应用程序时 运行 遇到了这个错误。当然 sqflite 不支持网络,所以我不应该对它抛出错误感到惊讶! 运行 在移动模拟器(或 macOS)中应该可以工作。