web-dev-qa-db-ja.com

AndroidのバックグラウンドフェッチでFlutterアクセス​​データベース

アプリが完全に閉じている間にデバイスのローカルデータベースにアクセスしようとしています。これを達成するには、sqliteプラグインを使用していますsqflite: ^1.2.0およびバックグラウンドフェッチプラグインbackground_fetch: ^0.4.0

ヘッドレスバックグラウンドタスクを問題なく登録できます。バックグラウンドタスクを実行しようとすると、次のエラーが発生します。

プラグインは、アプリの実行中、またはバックグラウンドモードになっているときに正常に動作するようです。

何か提案がありますか?

エラー

[ERROR:flutter/lib/ui/ui_Dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite)

Flutterバージョン:

Flutter 1.12.13+hotfix.7 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 9f5ff2306b (11 days ago) • 2020-01-26 22:38:26 -0800
Engine • revision a67792536c
Tools • Dart 2.7.0

フラッタードクター

[✓] Flutter (Channel stable, v1.12.13+hotfix.7, on Mac OS X 10.15.2 19C57, locale en-GB)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 11.3)
[✓] Android Studio (version 3.5)
[✓] Connected device (1 available)

• No issues found!

2
user3057745

あなたのケースが私のケースと同じである場合、私はKotlinのカスタムプラグインを持っているので、GeneratedPluginRegistrant.registerWith(this)MainActivityにインポートしませんでした。代わりに、configureFlutterEngine()関数の開始時に実装し、完全に機能しました。

import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity : FlutterActivity() {

    private val CHANNEL = "getEpubs"
    var _eventSink: EventChannel.EventSink? = null

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
}

これにより、デバイス上のデータベースへの生成されたsqfliteプラグインアクセスが登録されます。

(Kotlinコードは申し訳ありませんが、Javaに変更できます。)

インポートすることを忘れないでください:

io.flutter.plugins.GeneratedPluginRegistrant
0
Samson Ayalew

バックグラウンド分離からsqfliteを使用することについていくつかの実験があり、プラグインのサポートについてはここではわかりません。とにかく、トランザクションメカニズムは同じプロセスの分離全体で安全ではないので、メインの分離からsqfliteを使用することをお勧めします(すでに独自のスレッドを使用しています)。

0
alextk