0

我正在尝试在我的 Flutter 应用程序中实现包 shared_preferences 。

我已将包包含在 pubspec.yaml 文件中。

我创建了一个名为 StorageUtil 的帮助程序类来管理项目中的 shared_preferences。

这是 shared_preferences_util.dart:

import 'package:shared_preferences/shared_preferences.dart';

class StorageUtil {
  static StorageUtil _storageUtil;
  static SharedPreferences _preferences;

  static Future<StorageUtil> getInstance() async {
    if (_storageUtil == null) {
      // keep local instance till it is fully initialized.
      var secureStorage = StorageUtil._();
      await secureStorage._init();
      _storageUtil = secureStorage;
    }
    return _storageUtil;
  }

  StorageUtil._();
  Future _init() async {
    _preferences = await SharedPreferences.getInstance();
  }

  // get string
  static String getString(String key, {String defValue = ''}) {
    if (_preferences == null) return defValue;
    return _preferences.getString(key) ?? defValue;
  }

  // put string
  static Future<bool> putString(String key, String value) {
    if (_preferences == null) return null;
    return _preferences.setString(key, value);
  }
}

然后在文件 notification_service.dart 我在 shared_preferences 中创建一个项目:

  _refreshToken() {
    _firebaseMessaging.getToken().then((token) async {
      print('token: $token');
      StorageUtil.putString("token_firebase", token.toString());
      print('token despues de shared:' + token);
    }, onError: _tokenRefreshFailure);
  }

打印输出:

I/flutter (29912): token despues ed shared:fy0Pk1asTOejYrWYXbULBu:APA91bGk2TLqdiLbGvZp7IrTggLfjwYcvhENB83RQj-7x1CEPoou_cY7Rq0eB6rFqEfb386pxSsWAogRc8HwQjK0Y9q9kyKgzSJ6ZCQ3qhFBIjaLhS2sZKJ-N1k7hdrRHdboyUb3WvGS

后来我试图得到 shared_preferences 项目如下:

final _tokenFb = StorageUtil.getString("token_firebase");

但它始终是空字符串。

print("Token firebase en authbloc: " + _tokenFb);

输出:

I/flutter (29912): Token firebase en authbloc: 

我错过了什么?

4

1 回答 1

1

_preferences是空的,因为你没有打电话await StorageUtil.getInstance()给你的班级。因此,该_init方法没有被调用,SharedPreferences也没有被初始化。

你应该这样称呼它:

  _refreshToken() {
    _firebaseMessaging.getToken().then((token) async {
      print('token: $token');
      var storageUtil = await StorageUtil.getInstance();
      storageUtil.putString("token_firebase", token.toString());
      print('token despues de shared:' + token);
    }, onError: _tokenRefreshFailure);
  }

当然也是如此StorageUtil.getString

于 2020-12-18T15:34:28.583 回答