繁体   English   中英

如何访问安全存储中不同 dart 页面中保存为变量的令牌

[英]How to access token saved as a variable in different dart page in a secured storage

我已将令牌作为变量保存在名为login_response_model.dart的文件中的 flutter 安全存储中,我试图在主屏幕中访问它,但我不断收到未定义名称的错误消息:

这是login_response_model.dart

class LoginResponse {
  dynamic? key;
  List<dynamic>? non_field_errors;
  LoginResponse({this.key, this.non_field_errors});

  factory LoginResponse.fromJson(mapOfBody) {
    return LoginResponse(
      key: mapOfBody['key'],
      non_field_errors: mapOfBody['non_field_errors'],
    );
  }
}

LoginResponseModel loginResponseJson(String str) =>
    LoginResponseModel.fromJson(json.decode(str));

class LoginResponseModel {
  dynamic? key;
  List<dynamic>? non_field_errors;
  LoginResponseModel({this.key, this.non_field_errors});

  LoginResponseModel.fromJson(mapOfBody) {
    key:
    mapOfBody['key'];
    non_field_errors:
    mapOfBody['non_field_errors'];
    print(mapOfBody['key']);

    // Create storage
    final storage = new FlutterSecureStorage();
    // Write value
    storage.write(key: 'Token', value: mapOfBody['key']);
  }

  Map<String, dynamic> toJson() {
    final _data = <String, dynamic>{};
    _data['key'] = key;
    _data['non_field_errors'] = non_field_errors;
    return _data;
  }
}

class Data {
  Data({
    required this.username,
    required this.email,
    required this.date,
    required this.id,
    required this.key,
  });
  late final String username;
  late final String email;
  late final String date;
  late final String id;
  late final String key;

  Data.fromJson(Map<String, dynamic> json) {
    username = json['username'];
    email = json['email'];
    date = json['date'];
    id = json['id'];
    key = json['key'];
  }

  Map<String, dynamic> toJson() {
    final _data = <String, dynamic>{};
    _data['username'] = username;
    _data['email'] = email;
    _data['date'] = date;
    _data['id'] = id;
    _data['key'] = key;
    return _data;
  }
}

这是主屏幕:


Future<User> fetchUser() async {
  var url = Uri.parse(Config.apiURL + Config.userProfileAPI);
  var value = storage.read(key: 'Token');

我的问题:

如何将保存在安全存储中的令牌访问到主屏幕? 除了我安排的方式之外,是否有更简单、更安全的方式来访问保存的令牌?

您可以在此处使用SharedPreference和保存令牌吗? 每次你想使用时,你只需要:

SharedPreferences prefs = await SharedPreferences.getInstance();
String token = prefs.getString("key_token") ?? "";

但是,每次您想使用它时,您都需要再次使用 async function 并等待它为您提供已保存的令牌。 虽然它不需要那么多时间和空间,但我们需要注意这一点。 每当打开应用程序或登录成功时,您都可以初始化一个全局变量来保存令牌。 了解有关Singleton的更多信息。

我的应用程序中的示例: data_instance.dart

class DataInstance {

    static DataInstance _instance = new DataInstance.internal();

    DataInstance.internal();

    factory DataInstance() => _instance;

    late String accessToken;
    initPreference() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        DataInstance().accessToken = prefs.getString("key_token_haha")?? '';
    }
}

main.dart

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await DataInstance().initPreference();
  runApp(const MyApp());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM