0

我正在使用该shared_preferences软件包。https://pub.dev/packages/shared_preferences/example

在我的存储库类中,对于每个函数,我这样做是为了获取实例。

SharedPreferences prefs = await SharedPreferences.getInstance();

class AuthenticationRepository {

 Future<dynamic> logIn({required String email, required String password}) async {
     SharedPreferences prefs = await SharedPreferences.getInstance(); <--------
     ....
     prefs.clear();

     prefs.setString('user', encodedUser);
   }

   
 Future<String> logOut() async {

    SharedPreferences prefs = await SharedPreferences.getInstance(); <---------
    prefs.clear();
    if(prefs.containsKey('user')){
      return 'failed';
    }else{
      return 'cleared';
    }
  }

}
  1. 我只是想知道这是否正在启动一个新的 sharedPreference 对象,或者正如函数所暗示的那样,我们只得到相同的实例?

  2. 有没有更好的方法来创建一次实例,可能是像下面这样的类变量?

class AuthenticationRepository {
 
 SharedPreferences prefs = await SharedPreferences.getInstance();

 Future<dynamic> logIn({required String email, required String password}) async {

     ....
     this.prefs.clear();

     prefs.setString('user', encodedUser);
   }

   
  Future<String> logOut() async {


    this.prefs.clear();
    if(prefs.containsKey('user')){
      return 'failed';
    }else{
      return 'cleared';
    }
  }
}

请指教,提前谢谢:)

4

1 回答 1

0
  1. 是的,您可以获得相同的实例。在shared_preference.dart文件中,有一个静态值_completer。这里是getInstance()函数。您可以看到,它在初始化if (_completer == null)后立即返回一个值。_completer
static Completer<SharedPreferences>? _completer;

...

static Future<SharedPreferences> getInstance() async {
  if (_completer == null) {
    final completer = Completer<SharedPreferences>();
    try {
      final Map<String, Object> preferencesMap =
          await _getSharedPreferencesMap();
      completer.complete(SharedPreferences._(preferencesMap));
    } on Exception catch (e) {
      // If there's an error, explicitly return the future with an error.
      // then set the completer to null so we can retry.
      completer.completeError(e);
      final Future<SharedPreferences> sharedPrefsFuture = completer.future;
      _completer = null;
      return sharedPrefsFuture;
    }
    _completer = completer;
  }
  return _completer!.future;
}
  1. 我认为这是使用该getInstance()功能而不是创建另一个类的更好方法。
于 2021-07-16T09:21:11.307 回答