База данных доступа Flutter в фоновой выборке на Android

Я пытаюсь получить доступ к локальной базе данных на устройстве, когда приложение полностью закрыто, для этого я использую плагин 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 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!


person Billy Mahmood    schedule 07.02.2020    source источник


Ответы (4)


Вы можете попробовать посмотреть sqflite раздел устранения неполадок на их странице Github, особенно тот, который связан с вашей ошибкой. Позвольте мне вставить сюда фрагменты этой страницы.

Эта ошибка обычно является ошибкой сборки / настройки после добавления зависимости.

  • Попробуйте все шаги, указанные в верхней части документов
  • Убедитесь, что вы остановили текущее запущенное приложение, если оно есть
  • Заставить флаттер получить пакеты
  • Попробуйте почистить папку сборки flutter clean
  • В iOS вы можете попробовать принудительно установить / обновить модуль.
  • Ищите другие ошибки в подобном флаттере, другие люди сталкиваются с той же проблемой с другими плагинами, поэтому, вероятно, это не связано с sqflite

Расширенные проверки:

Убедитесь, что файл GeneratedPluginRegistrant, который должен был сгенерироваться запуском флаттера в вашем проекте, содержит строку, регистрирующую плагин.

Android:

SqflitePlugin.registerWith(registry.registrarFor("com.tekartik.sqflite.SqflitePlugin"));

iOS:

[SqflitePlugin registerWithRegistrar:[registry registrarForPlugin:@"SqflitePlugin"]];
  • Проверка MainActivity.java (Android) содержит вызов GeneratedPluginRegistrant с просьбой зарегистрироваться. Этот вызов следует производить из метода запуска приложения (onCreate).
public class MainActivity extends FlutterActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GeneratedPluginRegistrant.registerWith(this);
    }
}
  • Проверка AppDelegate.m (iOS) содержит вызов GeneratedPluginRegistrant с просьбой зарегистрироваться. Этот вызов следует выполнять из метода запуска приложения (application: didFinishLaunchingWithOptions :).
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GeneratedPluginRegistrant registerWithRegistry:self];
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

Прежде чем поднимать эту проблему, попробуйте добавить еще один хорошо зарекомендовавший себя плагин (самый простой - path_provider или shared_preferences), чтобы увидеть, появляется ли здесь ошибка.

person Zerocchi    schedule 10.02.2020
comment
Привет, спасибо за ответ, я уже выполнил все вышеперечисленные проверки, плагин работает нормально, когда приложение находится на переднем плане, проблема в том, что приложение работает в автономном режиме. - person Billy Mahmood; 10.02.2020

Было несколько экспериментов с использованием sqflite из фонового изолята, и я не уверен в поддержке плагинов здесь. В любом случае механизм транзакции небезопасен для изоляции в одном и том же процессе, поэтому я советую использовать sqflite из основного изолята (он уже использует свой собственный поток).

person alextk    schedule 12.02.2020
comment
Привет, я пытаюсь запустить свой код в автономном окружении приложения, так что это фоновая служба, которая запускается каждые 15 минут, даже если приложение закрыто. Плагин фоновой выборки, кажется, работает нормально, я просто не могу получить доступ к базе данных. - person Billy Mahmood; 12.02.2020

Если ваш случай такой же, как у меня, у меня есть собственный плагин с 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
person Samson Ayalew    schedule 21.05.2020

Это может быть связано с тем, что один из других плагинов в вашем проекте не работает во время регистрации плагина и не позволяет зарегистрировать другие плагины, перечисленные ниже.

Если вы видите строку ниже в своих журналах,

Tried to automatically register plugins with FlutterEngine @{engine hash appears here} but could not find and invoke the GeneratedPluginRegistrant;

установите точку останова в статическом методе GeneratedPluginRegister registerGeneratedPlugins(), чтобы увидеть, какое исключение выбрасывается.

В моем случае я использовал плагин, который вызывал метод io.flutter.plugin.common.PluginRegistry.Registrar activity(), который возвращает null, когда в приложении нет активности переднего плана.

person Edwin Nyawoli    schedule 22.04.2021