美文网首页
Flutter 中,两种单例实现

Flutter 中,两种单例实现

作者: Android那些事儿 | 来源:发表于2020-04-06 22:15 被阅读0次

    来自,Flutter SharedPreference 包,两种方式,归根结底,属于同一种方式,后一种,借助了Flutter Completer 。

    方式一:

    class SharedPreferences {
      SharedPreferences._(this._preferenceCache);
    
      static const String _prefix = 'flutter.';
      static SharedPreferences _instance;
      static Future<SharedPreferences> getInstance() async {
        if (_instance == null) {
          final Map<Object, Object> fromSystem =
              await _kChannel.invokeMethod('getAll');
          assert(fromSystem != null);
          // Strip the flutter. prefix from the returned preferences.
          final Map<String, Object> preferencesMap = <String, Object>{};
          for (String key in fromSystem.keys) {
            assert(key.startsWith(_prefix));
            preferencesMap[key.substring(_prefix.length)] = fromSystem[key];
          }
          _instance = SharedPreferences._(preferencesMap);
        }
        return _instance;
      }
    }
    
    

    方式二:

    class SharedPreferences {
      SharedPreferences._(this._preferenceCache);
    
      static const String _prefix = 'flutter.';
      static Completer<SharedPreferences> _completer;
    
      static SharedPreferencesStorePlatform get _store =>
          SharedPreferencesStorePlatform.instance;
    
      /// Loads and parses the [SharedPreferences] for this app from disk.
      ///
      /// Because this is reading from disk, it shouldn't be awaited in
      /// performance-sensitive blocks.
      static Future<SharedPreferences> getInstance() async {
        if (_completer == null) {
          _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;
          }
        }
        return _completer.future;
      }
    }
    

    相关文章

      网友评论

          本文标题:Flutter 中,两种单例实现

          本文链接:https://www.haomeiwen.com/subject/uhoiphtx.html