Флаттер доступа к базе данных в фоновом режиме на Android - PullRequest
0 голосов
/ 07 февраля 2020

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

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

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

0 голосов
/ 10 февраля 2020

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

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

  • Попробуйте выполнить все шаги, определенные в верхней части. документов
  • Убедитесь, что вы остановили текущее работающее приложение, если оно есть
  • Принудительное получение пакетов флаттера
  • Попробуйте очистить флаттер папки сборки
  • На iOS вы можете попытаться принудительно установить pod install / pod update
  • Искать другие ошибки во флаттере, как это, другие люди сталкиваются с той же проблемой с другими плагинами, так что, скорее всего, они не связаны с 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), чтобы увидеть, если вы также получаете ошибку здесь.

...