Flutter:无法使用workmanager初始化共享首选项

问题描述 投票:0回答:2

正如标题所说,我正在使用 2 个插件,workmanager共享首选项。 Workmanager 部分按预期工作,但我从共享首选项中收到错误。

这是我的代码的一部分,与workmanager插件有关:

void callbackDispatcher() {
  Workmanager().executeTask((taskName, inputData) async {
    switch (taskName) {
      case 'midnight_task':
        try {
          await SharedPrefsHelper().initSharedPrefsInstance(); //THIS line causes the error
          await PedometerService.midnightTask();
          print('workmanager_service.dart: looks like midnightTask got successfully executed :D');
        } catch (e) {
          print('workmanager_service.dart midnightTask error: $e');
        }
        break;
      default:
        print('workmanager_service.dart callbackDispatcher(): unhandled taskName: $taskName');
    }
    return Future.value(true); // "The task is successful"
  });
}

这是我处理共享首选项的代码的一部分:

SharedPreferences _prefs;

  Future<void> initSharedPrefsInstance() async {
    print('initSharedPrefsInstance()');
    if (_prefs == null) _prefs = await SharedPreferences.getInstance(); //the error gets thrown here
    print('shared prefs initialized()');
  }

  
  //this will NOT persist data
  Future<void> initSharedPrefsInstanceMock() async {
    print('initSharedPrefsInstanceMock()');
    SharedPreferences.setMockInitialValues({}); //<- this line: only difference to above method
    if (_prefs == null) _prefs = await SharedPreferences.getInstance();
    print('initSharedPrefsInstanceMock: shared prefs initialized()');
  }

在注释指定的行抛出以下错误:

workmanager_service.dart midnightTask error: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)

我已经尝试过 来自另一个 stackoverflow 问题(上一个代码示例中的第二种方法),它不会抛出错误,但正如那个人所说,它不会保留数据,所以它是无用的。我还尝试了他建议的其他事情(编辑

/android/app/build.gradle
),以及其他人建议的许多其他事情,但对我来说没有任何作用。

有人知道我可以做什么来解决这个问题吗?

flutter background sharedpreferences android-workmanager flutter-workmanager
2个回答
3
投票

这是由于

shared_preferences
的实施发生了变化,请参阅此问题进行讨论。

现在您可以在隔离中使用插件之前手动运行插件的 Dart 注册:

if (Platform.isAndroid) SharedPreferencesAndroid.registerWith();
if (Platform.isIOS) SharedPreferencesIOS.registerWith();

您需要添加对

shared_preferences_android
shared_preferences_ios
的直接依赖才能使用这些类。

更新:

shared_preferences_ios
的直接依赖项已与 macOS 的直接依赖项合并,并重命名为
shared_preferences_foundation


0
投票

我有同样的问题,错误是:

PlatformException(channel-error, Unable to establish connection on channel., null, null)

要解决这个问题,你应该更新 ios/Runner/AppDelegate.swift:

https://github.com/fluttercommunity/flutter_workmanager/blob/main/IOS_SETUP.md#registered-plugins

override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    // ...
    
    WorkmanagerPlugin.setPluginRegistrantCallback {
        registry in GeneratedPluginRegistrant.register(with: registry)
    }
    
    WorkmanagerPlugin.registerTask(withIdentifier: "your_task_identifier")
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
© www.soinside.com 2019 - 2024. All rights reserved.