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

Flutter: can't initialize shared preferences with workmanager

正如标题所说,我使用了 2 个插件,workmanager and shared preferences。 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).

我已经尝试了 this from another Whosebug question(前面代码示例中的第二种方法)并且它没有抛出错误,但是正如那个人所说,它不会持久化数据所以它没有用。我还尝试了他建议的其他方法(编辑 /android/app/build.gradle),以及其他人建议的许多其他方法,但对我没有任何作用。

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

这是由于 shared_preferences 的实现发生了变化,请参阅 this issue 进行讨论。

现在您可以 manually run the plugin's Dart registration 在隔离中使用它之前:

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

您需要添加对 shared_preferences_androidshared_preferences_ios 的直接依赖才能使用这些 类。