【问题标题】:sharedp references Getting Stored Data in Another Flutter Pagesharedp 参考在另一个 Flutter 页面中获取存储的数据
【发布时间】:2021-12-13 06:03:49
【问题描述】:

当用户登录到登录页面时,我想在我的主页中获取用户详细信息,例如 id、电子邮件、用户名。我能够通过这个获取数据

SPUtil.putString('user', user); 打印(用户);

现在,问题是我应该如何在另一个页面中提取它以供使用或显示这些数据。我有一个名为 sputils.dart 的文件,其中包含我用来获取数据的所有代码。

class AuthService {
  Future<String> login({
    required String username,
    required String password,
  }) async {
    try {
      final body = {
        'username': username,
        'password': password,
      };

      final response = await http.post(
        Uri.parse('$BASE_URL/login'),
        headers: {'Content-Type': 'application/json; charset=UTF-8'},
        body: jsonEncode(body),
      );

      if (response.statusCode != 200) {
        throw LoginError.unexpected;
      }
      Map<String, dynamic> data = jsonDecode(response.body);
      User loggedInUser = User.fromJson(data['user']);
      String user = jsonEncode(loggedInUser);

      SPUtil.putString('user', user);
      print(user);
      return jsonDecode(response.body)['token'];
    } on LoginError {
      print('login error');
      rethrow;
    } catch (e) {
      print(e);
      throw LoginError.unexpected;
    }
  }





import 'dart:async';
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:synchronized/synchronized.dart';

// SharedPreferences
class SPUtil {
  static SPUtil? _singleton;
  static SharedPreferences? _prefs;
  static final Lock _lock = Lock();

  static Future<SPUtil> getInstance() async {
    if (_singleton == null) {
      await _lock.synchronized(() async {
        if (_singleton == null) {
          // keep local instance till it is fully initialized.
          final singleton = SPUtil._();
          await singleton._init();
          _singleton = singleton;
        }
      });
    }
    return _singleton!;
  }

  SPUtil._();

  Future _init() async {
    _prefs = await SharedPreferences.getInstance();
  }

  // put object
  static Future<bool> putObject(String key, Object value) {
    return _prefs!.setString(key, json.encode(value));
  }

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

  // put string
  static Future<bool> putString(String key, String value) async {
    return _prefs!.setString(key, value);
  }

  // get bool
  static bool getBool(String key, {bool defValue = false}) {
    if (_prefs == null) return defValue;
    return _prefs!.getBool(key) ?? defValue;
  }

  // put bool
  static Future<bool> putBool(String key, {bool value = false}) {
    return _prefs!.setBool(key, value);
  }

  // get int
  static int getInt(String key, {int defValue = 0}) {
    if (_prefs == null) return defValue;
    return _prefs!.getInt(key) ?? defValue;
  }

  // put int.
  static Future<bool> putInt(String key, int value) {
    return _prefs!.setInt(key, value);
  }

  // get double
  static double getDouble(String key, {double defValue = 0.0}) {
    if (_prefs == null) return defValue;
    return _prefs!.getDouble(key) ?? defValue;
  }

  // put double
  static Future<bool> putDouble(String key, double value) {
    return _prefs!.setDouble(key, value);
  }

  // get string list
  static List<String> getStringList(String key,
      {List<String> defValue = const []}) {
    if (_prefs == null) return defValue;
    return _prefs!.getStringList(key) ?? defValue;
  }

  // put string list
  static Future<bool> putStringList(String key, List<String> value) {
    return _prefs!.setStringList(key, value);
  }

  // clear
  static Future<bool> clear() {
    return _prefs!.clear();
  }

  // clear a string
  static Future<bool> clearString(String key) {
    return _prefs!.remove(key);
  }

  //Sp is initialized
  static bool isInitialized() {
    return _prefs != null;
  }
}

【问题讨论】:

  • 好的,你为HomePagelogin 页面做了。在其他页面上应用相同方法时遇到什么错误?要获取数据使用async 检索数据,我还建议检查hive

标签: flutter dart authentication


【解决方案1】:

要使用其他页面中保存的数据,

  1. 将您的数据实例设为全局(静态)
  2. 将数据保存在静态类中

如果您的应用程序很简单并且只是测试一些东西,请转到 No.1。

否则,请转到第 2 号。

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2020-04-02
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2019-07-19
    • 2021-12-20
    相关资源
    最近更新 更多